Ответ 1
Самое простое решение выглядит как
try(library(xyz), silent=TRUE)
require
является в основном оберткой вокруг tryCatch(library)
, поэтому это просто вырезает какой-то посторонний код.
Я пытаюсь закодировать набор функций для проверки отсутствующих пакетов R и, при необходимости, установить их. Там есть хороший код для StackOverflow: начать здесь.
Я хотел бы сделать функции максимально тихими, тем более, что R возвращает даже успешные сообщения красными чернилами. Соответственно, я попытался передать аргумент quietly = TRUE
как на library
, так и на require
.
Однако эти параметры никогда не работают:
# attempt to get a silent fail
require(xyz, quietly = TRUE)
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called ‘xyz’
Как я могу заставить require
терпеть неудачу беззвучно, и что мне не нравится в опции quietly
?
В документации написано:
quietly
логический. Если TRUE, ни одно сообщение, подтверждающее загрузку пакета, не печатается, и чаще всего не печатаются ошибки/предупреждения, если загрузка пакета завершается с ошибкой.
Но мне кажется, что "чаще всего" должен быть "почти никогда" в моем личном опыте. Я бы с радостью узнал о вашем опыте с этим. Обоснование: функции кодирования, помогающие студентам.
Добавить. Тот же вопрос относится к quiet = TRUE
в install.packages()
. Он убивает только индикатор выполнения, но не следующее сообщение "загруженные двоичные пакеты в" (напечатано черным, yay!), Хотя оно не имеет смысла для медианного пользователя.
Добавить. Если это может быть интересно кому-либо, код до сих пор:
## getPackage(): package loader/installer
getPackage <- function(pkg, load = TRUE, silent = FALSE, repos = "http://cran.us.r-project.org") {
if(!suppressMessages(suppressWarnings(require(pkg, character.only = TRUE, quietly = TRUE)))) {
try(install.packages(pkg, repos = repos), silent = TRUE)
}
if(load) suppressPackageStartupMessages(library(pkg, character.only = TRUE, quietly = TRUE))
if(load & !silent) message("Loaded ", pkg)
}
## Not run:
x <- c("ggplot2", "devtools") # etc.
lapply(x, getPackage, silent = TRUE)
Я думаю о том, чтобы просто отказаться от использования quietly
в вышеприведенной функции, учитывая, что она не работает, когда ожидается. Вероятно, я должен попросить R-пользователей о том, чтобы получить объяснение от основного devteam. Обходной путь suppressMessages(suppressWarnings(require(...)))
может быть неустойчивым в моем опыте.
Самое простое решение выглядит как
try(library(xyz), silent=TRUE)
require
является в основном оберткой вокруг tryCatch(library)
, поэтому это просто вырезает какой-то посторонний код.
Если вы хотите сделать вашу require
функцию очень тихой, вы можете использовать:
suppressMessages(suppressWarnings(require(xyz)))
Что дает:
... ну, ничего:)
Я не уверен точно, когда это было добавлено к языку, но предпочтительный способ сделать это сейчас
suppressPackageStartupMessages({
require(this)
require(that)
...
})
Это вызывает "Загрузка...", жалобы на маскирующие символы и другие шумы, но сообщения, указывающие на фактические проблемы, все еще появляются (например, пакет или зависимость недоступны).
Один способ обхода - установить параметры предупреждений до и после вызова...
options(warn=-1)
try(require(xyz, quietly = TRUE),silent=TRUE)
options(warn=0)
Но это опасно.. Я думаю, что вам нужно изменить цвет предупреждающего сообщения.
PkgNames <- c("forecast", "tseries", "ggplot2", "qcc", "ggmap","corrgram",
"effects", "Hmisc", "plyr", "reshape")
invisible(suppressMessages(suppressWarnings(lapply(PkgNames, require, character.only = T))))