Подавить установку выходов в R
Это действительно начинает меня беспокоить... Я пробовал несколько методов, и, похоже, ни один из них не работает
Я запускаю установку из функции, которая генерирует много ненужных сообщений, которые я хотел бы подавить, но все методы, которые я пытался сделать, не сработали.
Часть кода, которую я пытаюсь подавить: install_github('ROAUth', 'duncantl')
требуется пакет devtools
быть загруженным заранее.
Во всяком случае, я пытался invisible
, capture.output
а также sink
, ни одна из которых не работает... или, возможно, я не использую их правильно... в любом случае... какие-либо идеи?
4 ответа
suppressMessages
отключит некоторые сообщения (те, которые были напечатаны через message
), но не все.
Остальные сообщения поступают с закрытого звонка R CMD INSTALL
через system2
функция. Я думаю, что это потому, что это вычеркнуто, что все обычные вещи, которые вы пытались (sink
, capture.output
и т. д.) не работают. Обратите внимание, что system2
функция приходит с stderr
а также stdout
аргументы, которые, если обратиться к FALSE
отключит все эти сообщения. К несчастью, system2
использования stdout = ""
а также stderr = ""
по умолчанию, и, кажется, нет возможности получить доступ к этим аргументам через devtools
пакет.
Таким образом, один из способов, которым мне удалось запустить без каких-либо сообщений, это временно перезаписать 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")
Вот еще одна возможность. Преимущество здесь в том, что вам не нужно сбрасывать system2
после звонка install_github
: system2
будет продолжать демонстрировать поведение по умолчанию для всех вызовов, кроме тех, которые были инициированы вызовом install_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'))
Другой метод будет патч devtools
функции, так что они позволяют вам передать stdout
аргумент system2
, Также не очень элегантно, но, возможно, вы могли бы убедить авторов пакета изменить devtools
в этом случае. Вот мои залатаны build
а также install
функции:
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))
По сути, вы проходите вдоль ...
в трех местах, дважды в install
функция, и один раз в build
функция.
В случае
install.packages
, Eсть
quiet
переключатель, который вы можете включить, чтобы подавить вывод.
Подробнее смотрите в документации install.packages .