使用粘贴和替代与R中的引号组合

时间:2014-04-14 14:07:59

标签: r function paste substitution quotation-marks

请注意,我已查看thisthat,但仍无法解决我的问题。

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

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的函数调用的格式应被视为固定,即,对函数进行的唯一更改本身,而不是电话。即foo(a, b, data = dftest)是唯一允许的输入。

方法:我尝试将pastesubstituteeval结合使用,首先用函数调用的参数替换xy然后评估电话。但是,转义引号似乎是一个问题:

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"),因此再次导致与上述相同的错误。

1 个答案:

答案 0 :(得分:2)

试试这个:

foo <- function(x, y, data = data) {
    x <- deparse(substitute(x))
    y <- deparse(substitute(y))
    data[, c(x, y)]
}