我厌倦了用require(data.table); require(ggplot2)
etc 等开始我的脚本。我知道我可以做类似的事情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
可用于require_mult(data.table, ggplot2)
等的方法,它将丰富我对 R 表达式评估的理解。
解释为什么不能这样做也是可以接受的。