Мне надоело запускать свои скрипты с require(data.table); require(ggplot2)
и т. Д. Я знаю, что могу сделать что-то вроде lapply(c('data.table', 'ggplot2'), require, character.only=T)
, но он просто вернет предупреждение (а не ошибку) для недостающий пакет, плюс мне нужна моя собственная функция require_mult(...)
, чтобы мои сценарии были чище. Так что я написал функцию:функция для загрузки нескольких пакетов с вводом как несимвольный список
require_mult <- function(...){
arg_list <- list(...)
if(any(!sapply(arg_list, is.character))) stop('require_mult must have character arguments')
check <- tryCatch({pkg_array <- unlist(arg_list)
loaded <- sapply(pkg_array, require, character.only=TRUE, quietly=TRUE)
message('Loaded packages: ',
paste(pkg_array, collapse=', ')) },
warning = function(w) stop(w), # I want execution to halt if a package is missing
error = function(e) stop(e)
)
}
который, кажется, работает по желанию (например, грузы для require_mult('data.table','ggplot2')
, ошибки для require_mult('data.table','ggplotfoo')
), но я хотел бы сделать эту работу require_mult(...)
для character.only=FALSE
. Я посмотрел на определение require
, который использует
if (!character.only)
package <- as.character(substitute(package))
Но я не могу понять, как применить substitute
поперек невычисленного выражение, которое действительно разделенный запятыми список.
Я знаю, что это приложение является довольно бессмысленным и академическим, но было бы обогатить свое понимание вычисления выражения R, если есть на самом деле способ написать require_mult
, который может быть использован для require_mult(data.table, ggplot2)
и т.д.
объяснения почему это не может быть сделано, также будет приемлемым.
Вы не хотите использовать 'require' здесь - вы можете найти эту статью Yihui Се полезно: http://yihui.name/en/2014/07/library-vs-require/ – TARehman
@ TARehman, я понял, что, но вы можете понять, как передать несколько имен пакетов в библиотеку? Это не работает: 'lapply (c ('data.table', 'ggplot2'), library, character.only = T)' Если вы можете предоставить решение с помощью 'library' всеми способами, пожалуйста, сделайте это. – C8H10N4O2
Я считаю, что вы просто хотите 'do.call'. Вам определенно нужен список передаваемых пакетов, чтобы быть несимвольным? Я мог бы написать для этого функцию обертки. Или он должен поднять _error_, а не _warning_? – TARehman