R:通过第三个字符串变量以点(...)传递参数名称

时间:2018-04-03 15:26:50

标签: r function

想象一下,你有一个简单的函数,它指定为每个变量运行哪些统计测试。为了这个问题,它的语法简化如下:

test <- function(...) {
  x <- list(...)
  return(x)
} 

采用Gender = 'Tukey'之类的参数对,并打算将其结果传递给其他函数。 test()的输出如下:

test(Gender = 'Tukey')
# $Gender
# [1] "Tukey"

所需要的是能够通过动态分配的变量Gender替换文字varname(例如,用于循环目的)。目前发生的事情是:

varname <- 'Gender'
test(varname = 'Tukey')
# $varname
# [1] "Tukey"

但是需要的是:

varname <- 'Gender'
test(varname = 'Tukey')
# $Gender
# [1] "Tukey"

我尝试修改eval()parse()等功能,但无济于事。在实践中,我通过简单地重命名结果列表来解决问题,但这是一个丑陋的解决方案,我确信有一种优雅的R方式来实现它。提前感谢您的答案的教育价值。

注意:我在尝试编写自定义函数时遇到了这个问题,该函数在其内部使用mcp()包中的effects。所述mcp()函数是test()的真实对应函数。

EDIT1:也许需要澄清的是(出于教育目的)改变test()不是一种选择。问题是如何将传递棘手的参数传递给test()。如果你看一下NB,就会明白为什么:test()的真实世界,即mcp()附带一个包。虽然可以创建它的修改副本,但我真的很好奇是否存在一个简单的解决方案,以某种方式将动态分配的变量“转换”为点参数上下文中的文字。

3 个答案:

答案 0 :(得分:2)

这有效:

test <- function(...) {
  x = list(...)
  names(x) <- sapply(names(x), 
                     function(p) eval(as.symbol(p)))
  return(x)
}

apple = "orange"
test(apple = 5)

答案 1 :(得分:2)

我们可以使用

test <- function(...) {
  x <- list(...)
  if(exists(names(x))) names(x) <- get(names(x))
  x

} 



test(Gender = 'Tukey')
#$Gender
#[1] "Tukey"

test(varname = 'Tukey')
#$Gender
#[1] "Tukey"

答案 2 :(得分:1)

这个怎么样:

varname <- "Gender"
args <- list()
args[[varname]] <- "Tukey"
do.call(test, args)