【问题标题】:How to pass a parameter name as an argument to a function如何将参数名称作为参数传递给函数
【发布时间】:2020-10-19 08:30:59
【问题描述】:

我知道这个标题可能没有任何意义。我到处搜索,但找不到答案。我要做的是创建一个函数,该函数将获取另一个函数的参数名称,一个向量,然后继续调用该函数,参数值等于向量中的每个项目。

为简单起见,我处理的不是下面的向量,而是一个整数。

tuner <- function(param, a, ...) {
  myfunction(param = a, ...)
}

并且代码将有效地运行

myfunction(param = a)

我无法让它工作!代码实际运行,但结果调用完全忽略了我输入的参数并运行

myfunction()

相反。有什么解决办法吗?

【问题讨论】:

  • 你是怎么打电话给tuner的?请注意,您不能将参数名称视为 R 中的变量。您需要为此使用特殊语法。可能使用来自rlangdo.call:=eval_tidy。向reproducible example 提供帮助会更容易,因为我们可以实际运行代码和数据来测试和验证可能的解决方案。

标签: r function


【解决方案1】:

您不能真正将参数名称视为需要在 R 中评估的变量。Onw 解决方法是构建一个参数列表,然后将其传递给do.call。例如

myfunction <- function(x=1, y=5)  {
  x+y
}

tuner <- function(param, a, ...) {
  do.call("myfunction", c(setNames(list(a), param), list(...)))
}

tuner("x", 100)
# [1] 105
tuner("y", 100)
# [1] 101
tuner("y", 100, 2)
# [1] 102

使用rlang 的另一种方式是

library(rlang)
tuner <- function(param, a, ...) {
  args <- exprs(!!param := a, ...)
  eval_tidy(expr(myfunction(!!!args)))
}

这将给出相同的结果。

【讨论】:

  • 哇!非常有帮助。非常感谢您为我的下一个问题提供指导!