假设一个最小的工作示例:
a <- c(1,2,3)
b <- c(2,3,4)
c <- c(4,5,6)
dftest <- data.frame(a,b,c)
foo <- function(x, y, data = data) {
data[, c("x","y")]
}
foo(a, b, data = dftest)
在这里,最后一行显然返回一个Error: undefined columns selected
. 返回此错误是因为要选择的列是x
和y
,它们不是数据框的一部分dftest
。
问题:我需要如何制定函数的定义以获得所需的输出,即
> dftest[, c("a","b")]
# a b
# 1 1 2
# 2 2 3
# 3 3 4
我想通过调用函数来获得foo
。
请注意,为了使解决方案对我的目的有用,函数调用的格式foo
应被视为固定的,即仅对函数本身进行更改,而不是对调用进行更改。iefoo(a, b, data = dftest)
是唯一允许的输入。
方法:我尝试将paste
andsubstitute
结合使用eval
,首先将x
and替换y
为函数调用的参数,然后评估调用。但是,在这里转义引号似乎是一个问题:
foo <- function(x, y, data = data) {
substitute(data[, paste("c(\"",x,"\",\"",y,"\")", sep = "")])
}
foo(a, b, data = dftest)
eval(foo(a, b, data = dftest))
在这里,foo(a, b, data = dftest)
返回:
dftest[, paste("c(\"", a, "\",\"", b, "\")", sep = "")]
但是,在评估时eval()
(仅关注paste
部分),
paste("c(\"", a, "\",\"", b, "\")", sep = "")
返回:
# "c(\"1\",\"2\")" "c(\"2\",\"3\")" "c(\"3\",\"4\")"
而不是我希望的那样c("a","b")
,因此再次导致与上述相同的错误。