【问题标题】:Selecting Which Argument to Pass Dynamically in R在 R 中选择动态传递的参数
【发布时间】:2015-07-13 19:48:52
【问题描述】:

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

这是一个玩具示例:

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

【问题讨论】:

  • 是的,我知道我可以给所有 args 默认值,然后在其中一个上切换一些自定义值,然后执行函数调用,但我想一次性完成。
  • PS:我猜这是一些do.call的事情......?以前从未使用过它,所以我可以使用一些帮助...

标签: r data.table


【解决方案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 标准评估函数中借用的。

【讨论】:

  • 谢谢!这对于玩具示例非常有效,但前提是我将两个参数都传递给它,这是我试图避免的!此外,在我的 实际 用例(反应性闪亮函数中的一些参数)中它有点不同,但我会研究它(可能需要一段时间才能理解 为什么这段代码有效)。
【解决方案2】:

我设法得到了结果

hellraiser(eval(parse(text=paste(whicharg, ' = \"', whichval, '\"', sep=''))))

【讨论】:

  • 谢谢,这似乎有效!我会稍等片刻,看看是否有更直接的方法即将推出,否则我会接受它作为规范。
  • 您总是可以编写一个函数,接收与“参数”、“值”方案相对应的长度为 2 的向量列表,在每个向量上使用上述粘贴命令,然后折叠他们用','。如果你愿意,我可以在我的答案中编辑它。
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
相关资源
最近更新 更多