12

これは本当に私を悩ませ始めています...いくつかの方法を試しましたが、どれもうまくいかないようです

抑制したい多くの不要なメッセージを生成する機能からインストールを実行していますが、これを実行しようとしたすべての方法が機能しませんでした。

私が抑制しようとしているコードのビットは :です。事前install_github('ROAUth', 'duncantl')にパッケージをロードする必要があります。devtools

とにかく、私は試してみましinvisibleた、capture.outputそしてsink、どれもうまくいきません...または、おそらく私はそれらを正しく使用していません...どちらにしても...何かアイデアはありますか?

4

3 に答える 3

10

suppressMessages一部のメッセージ ( の呼び出しによって出力されたものmessage) をオフにしますが、すべてではありません。

R CMD INSTALL残りのメッセージは、関数を介してシェルアウトされた呼び出しから来ていsystem2ます。あなたが試したすべての通常のこと(sinkcapture.output、など)が機能しないのは、これがシェルアウトされているためだと思います。このsystem2関数にはstderrstdout引数が付属していることに注意してFALSEください。残念ながら、デフォルトではandをsystem2使用しており、パッケージを通じてこれらの引数にアクセスする方法はないようです。stdout = ""stderr = ""devtools

したがって、メッセージなしで実行する方法の 1 つsystem2は、基本環境で関数を一時的に上書きすることです。特にエレガントではありませんが、機能します:

# store a copy of system2
assign("system2.default", base::system2, baseenv())

# create a quiet version of system2
assign("system2.quiet", function(...)system2.default(..., stdout = FALSE,
                                                     stderr = FALSE), baseenv())

# overwrite system2 with the quiet version
assignInNamespace("system2", system2.quiet, "base")

# this is now message-free:
res <- eval(suppressMessages(install_github('ROAUth', 'duncantl'))) 

# reset system2 to its original version
assignInNamespace("system2", system2.default, "base")
于 2012-09-14T04:33:21.053 に答える
3

ここに別の可能性があります。ここでの利点は、をsystem2呼び出した後にリセットする必要がないことinstall_githubです。system2install_github()

# store a copy of system2
assign("system2.default", base::system2, baseenv())

# create a quiet version of system2
assign("system2.quiet", function(...)system2.default(..., stdout = FALSE,
                                                     stderr = FALSE), baseenv())
# redefine system2 to use system2.quiet if called from "install_github"
assignInNamespace("system2",
    function(...) {
        cls <- sys.calls()
        from_install_github <- 
            any(sapply(cls, "[[", 1) == as.name("install_github"))
        if(from_install_github) {
            system2.quiet(...)
        } else {
            system2.default(...)
        }},
    "base")


## Try it out
library(devtools)
suppressMessages(install_github('ROAUth', 'duncantl'))
于 2012-09-20T00:20:26.697 に答える
3

もう 1 つの手法は、関数にパッチを適用して、引数をdevtoolsに渡せるようにすることです。また、あまりエレガントではありませんが、パッケージの作成者にこの方法で変更するよう説得することもできます。ここに私のパッチと機能があります:stdoutsystem2devtoolsbuildinstall

library(devtools)

# New functions.
my.install<-function (pkg = ".", reload = TRUE, quick = FALSE, args = NULL, ...) 
{
    pkg <- as.package(pkg)
    message("Installing ", pkg$package)
    devtools:::install_deps(pkg)
    built_path <- devtools:::build(pkg, tempdir(),...) # pass along the stdout arg
    on.exit(unlink(built_path))
    opts <- c(paste("--library=", shQuote(.libPaths()[1]), sep = ""), 
        "--with-keep.source")
    if (quick) {
        opts <- c(opts, "--no-docs", "--no-multiarch", "--no-demo")
    }
    opts <- paste(paste(opts, collapse = " "), paste(args, collapse = " "))
    devtools:::R(paste("CMD INSTALL ", shQuote(built_path), " ", opts, sep = ""),...) # pass along the stdout arg
    if (reload) 
        devtools:::reload(pkg)
    invisible(TRUE)
}

my.build<-function (pkg = ".", path = NULL, binary = FALSE, ...) 
{
    pkg <- as.package(pkg)
    if (is.null(path)) {
        path <- dirname(pkg$path)
    }
    if (binary) {
        cmd <- paste("CMD INSTALL ", shQuote(pkg$path), " --build", 
            sep = "")
        ext <- if (.Platform$OS.type == "windows") 
            "zip"
        else "tgz"
    }
    else {
        cmd <- paste("CMD build ", shQuote(pkg$path), " --no-manual --no-resave-data", 
            sep = "")
        ext <- "tar.gz"
    }
    devtools:::R(cmd, path, ...) # pass along the stdout arg
    targz <- paste(pkg$package, "_", pkg$version, ".", ext, sep = "")
    file.path(path, targz)
}

# Patch package.
unlockBinding("install", as.environment("package:devtools"))
unlockBinding("build", as.environment("package:devtools"))
assignInNamespace('install', my.install, ns='devtools', envir=as.environment("package:devtools"));
assignInNamespace('build', my.build, ns='devtools', envir=as.environment("package:devtools"));
lockBinding("install", as.environment("package:devtools"))
lockBinding("build", as.environment("package:devtools"))

# Run with no messages.
suppressMessages(install_github('ROAUth','duncantl',stdout=NULL))

基本的に、関数内で 2 回、関数内で 1...回の 3 つの場所でを渡します。installbuild

于 2012-09-19T16:48:15.843 に答える