我试图将特定参数动态传递给函数,其中函数具有大多数或所有参数的默认值。
这是一个玩具示例:
library(data.table)
mydat <- data.table(evildeeds=rep(c("All","Lots","Some","None"),4),
capitalsins=rep(c("All", "Kinda","Not_really", "Virginal"),
each = 4),
hellprobability=seq(1, 0, length.out = 16))
hellraiser <- function(arg1 = "All", arg2= "All "){
mydat[(evildeeds %in% arg1) & (capitalsins %in% arg2), hellprobability]}
hellraiser()
hellraiser(arg1 = "Some")
whicharg = "arg1"
whichval = "Some"
#Could not get this to work:
hellraiser(eval(paste0(whicharg, '=', whichval)))
我想要一种方法来动态指定我调用哪个参数:换句话说,获得与hellraiser(arg1="Some")
相同的结果,但同时选择是否发送arg1 OR arg2动态。目标是能够仅使用指定的一个参数调用该函数,并动态指定它。
答案 0 :(得分:1)
你可以使用某种形式的do.call
喜欢
do.call("hellraiser", setNames(list(whichval), whicharg))
但实际上这似乎是处理函数参数的一种不好的方法。将参数视为可以更容易操作的列表可能更好。这是一个版本,允许您选择将参数名称视为列名
的值hellraiser2 <- function(..., .dots=list()) {
dots <- c(.dots, list(...))
expr <- lapply(names(dots), function(x) bquote(.(as.name(x)) %in% .(dots[[x]])))
expr <- Reduce(function(a,b) bquote(.(a) & .(b)), expr)
eval(bquote(mydat[.(expr), hellprobability]))
}
hellraiser2(evildeeds="Some", capitalsins=c("Kinda","Not_really"))
hellraiser2(.dots=list(evildeeds="Some", capitalsins=c("Kinda","Not_really")))
这种...
和.dots=
语法的使用来自dplyr
标准评估函数。
答案 1 :(得分:0)
我设法用
获得结果hellraiser(eval(parse(text=paste(whicharg, ' = \"', whichval, '\"', sep=''))))