想象一下,你有一个简单的函数,它指定为每个变量运行哪些统计测试。为了这个问题,它的语法简化如下:
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()
附带一个包。虽然可以创建它的修改副本,但我真的很好奇是否存在一个简单的解决方案,以某种方式将动态分配的变量“转换”为点参数上下文中的文字。
答案 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)