选择R中动态传递的参数

时间:2015-07-13 19:48:53

标签: r data.table

我试图将特定参数动态传递给函数,其中函数具有大多数或所有参数的默认值。

这是一个玩具示例:

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动态。目标是能够仅使用指定的一个参数调用该函数,并动态指定它。

2 个答案:

答案 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=''))))