Подтвердить что ты не робот

Когда "quietly = TRUE" действительно работает в функции require()?

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

4b9b3361

Ответ 1

Самое простое решение выглядит как

try(library(xyz), silent=TRUE)

require является в основном оберткой вокруг tryCatch(library), поэтому это просто вырезает какой-то посторонний код.

Ответ 2

Если вы хотите сделать вашу require функцию очень тихой, вы можете использовать:

suppressMessages(suppressWarnings(require(xyz)))

Что дает:

... ну, ничего:)

Ответ 3

Я не уверен точно, когда это было добавлено к языку, но предпочтительный способ сделать это сейчас

suppressPackageStartupMessages({
    require(this)
    require(that)
    ...
})

Это вызывает "Загрузка...", жалобы на маскирующие символы и другие шумы, но сообщения, указывающие на фактические проблемы, все еще появляются (например, пакет или зависимость недоступны).

Ответ 4

Один способ обхода - установить параметры предупреждений до и после вызова...

 options(warn=-1)
 try(require(xyz, quietly = TRUE),silent=TRUE)
 options(warn=0)

Но это опасно.. Я думаю, что вам нужно изменить цвет предупреждающего сообщения.

Ответ 5

PkgNames <- c("forecast", "tseries", "ggplot2", "qcc", "ggmap","corrgram",
              "effects", "Hmisc", "plyr", "reshape")
invisible(suppressMessages(suppressWarnings(lapply(PkgNames, require, character.only = T))))