1

请注意,我已经看过这个那个,但仍然无法解决我的问题。

假设一个最小的工作示例:

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. 返回此错误是因为要选择的列是xy,它们不是数据框的一部分dftest

问题:我需要如何制定函数的定义以获得所需的输出,即

> dftest[, c("a","b")]
#   a b
# 1 1 2
# 2 2 3
# 3 3 4

我想通过调用函数来获得foo

请注意,为了使解决方案对我的目的有用,函数调用的格式foo应被视为固定的,即仅对函数本身进行更改,而不是对调用进行更改。iefoo(a, b, data = dftest)是唯一允许的输入。

方法:我尝试将pasteandsubstitute结合使用eval,首先将xand替换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"),因此再次导致与上述相同的错误。

4

1 回答 1

2

尝试这个:

foo <- function(x, y, data = data) {
    x <- deparse(substitute(x))
    y <- deparse(substitute(y))
    data[, c(x, y)]
}
于 2014-04-14T14:13:15.110 回答