在多个表达式上使用eval(substitute())

7

我之前问过一个关于如何在没有引号的情况下获取文本/字符参数的问题,详情请参见此处。在我提出那个问题的场景中,参数数量是固定的,因此在函数定义中使用的eval(substitute())的数量对应着我拥有的参数数量。

现在,我遇到了一个场景,其中只有一个参数,例如factors(见下文),用户可以指定多个列名而不使用引号 - 即,他们将使用factor1而不是"factor1"。我希望评估用户提供的每个列名。

foo<-function(data.frame, factors){

}

问题1:我想知道是否有一种方法可以在表达式数量可变的情况下,将eval(substitute())应用于多个表达式。

正如指出的那样,eval(substitute())可能存在潜在危险,并且在某些情况下可能失败。

问题2:那么除了使用引号括起来的列名之外,是否有更优雅的方法来处理此问题,如下所示:

foo<-function(data.frame, factors){
   output<-data.frame[, factors]
   output
}
foo(data.frame=dataset, factors=c("factor1", "factor2"))
1个回答

9
首先,在你提供的示例中,我绝对更喜欢使用带引号的列名。其中一个好处是它们允许以下有用的间接操作:
XX <- c("cyl", "mpg")
foo(mtcars, XX)

话虽如此,如果您确实想传递一个未引用符号的向量,则可以解决您的第二个问题

foo <- function(data, factors) {
    jj <- as.character(substitute(factors)[-1])
    data[,jj]
}

head(foo(data = mtcars, factors = c(cyl, mpg)))
#                   cyl  mpg
# Mazda RX4           6 21.0
# Mazda RX4 Wag       6 21.0
# Datsun 710          4 22.8
# Hornet 4 Drive      6 21.4
# Hornet Sportabout   8 18.7
# Valiant             6 18.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接