Я пытаюсь закодировать набор функций для проверки отсутствующих пакетов 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(...)))
может быть неустойчивым в моем опыте.