我厭倦了開始我的腳本與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
。
我知道這個應用程序是非常沒有意義的,學術的,但如果事實上編寫可用於require_mult(data.table, ggplot2)
等
的解釋require_mult
的方式,將豐富我R的表達評價的理解爲什麼不能這樣做也是可以接受的。
你不想在這裏使用'require' - 你可能會發現這篇文章一匯謝有用:http://yihui.name/en/2014/07/library-vs-require/ – TARehman
@ TARehman我明白了 - 但你能想出如何將多個包名稱傳遞給'library'嗎?這是行不通的:'lapply(c('data.table','ggplot2'),library,character.only = T)'如果您可以通過'library'提供一切解決方案,請這樣做。 – C8H10N4O2
我相信你只是想'do.call'。你是否特別需要被傳遞給非字符的包列表?我可以看到爲此寫了一個包裝函數。還是它需要提出一個_error_,而不是_warning_? – TARehman