【问题标题】:Use eval(substitute()) on multiple expressions对多个表达式使用 eval(substitute())
【发布时间】:2013-03-09 19:35:59
【问题描述】:

我之前问过一个关于How to take in text/character argument without quotes 的问题。在我在那个问题中提供的场景中,参数的数量是固定的,所以我在函数定义中使用的 eval(substitute()) 的数量对应于我拥有的参数的数量。

现在我有一个场景,我有一个参数,例如factors(见下文),用户可以指定多个列名而不使用引号 - 即,他们将使用factor1 而不是@987654324 @。我想评估用户提供的每个列名。

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

}

问题一:我想知道当表达式的数量可以变化时,是否有办法将 eval(substitute()) 应用于多个表达式。

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

问题 2:除了使用如下所示的引用列名之外,是否有更优雅的方式来处理该问题:

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

【问题讨论】:

    标签: r eval substitution


    【解决方案1】:

    首先,在您提供的示例中,我肯定更喜欢使用带引号的列名。对他们有利的一件事是他们将允许如下有用的间接:

    XX <- c("cyl", "mpg")
    foo(mtcars, XX)
    

    也就是说,如果您确实想传入一个不带引号的符号向量,这可以解决您的问题 2

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多