假设一个最小的工作示例:
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
的函数调用的格式应被视为固定,即,对函数进行的唯一更改本身,而不是电话。即foo(a, b, data = dftest)
是唯一允许的输入。
方法:我尝试将paste
和substitute
与eval
结合使用,首先用函数调用的参数替换x
和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")
,因此再次导致与上述相同的错误。
答案 0 :(得分:2)
试试这个:
foo <- function(x, y, data = data) {
x <- deparse(substitute(x))
y <- deparse(substitute(y))
data[, c(x, y)]
}