【问题标题】:Passing an evaluated expression as named arg to function within function (R)将评估表达式作为命名 arg 传递给函数 (R) 内的函数
【发布时间】:2015-01-28 19:23:27
【问题描述】:

我想扩展一个 data.frame 以包含一个新列并为该列提供一个在函数中传递的动态分配的名称。这是一个简化的例子:

passMyName <-function(df, newColTitle) {
  df2 <-data.frame(df, newColTitle = rep(NA, nrow(df)))
  return(df2)
}

randomDF <-data.frame(a=1:3, b=4:6, c=7:9)
passMyName(randomDF, myCustomColTitle)

这将向 data.frame 添加一个新列,其变量名称由函数“newColTitle”定义。相反,我想将 newColTitle 评估为“myCustomColTitle”并将其作为此新列的命名标记传递,这样输出 data.fram 就会包含一个名为“myCustomColTitle”的新列。

这可能吗?也许通过substitute()、deparse()、quote()、eval()、paste() 等。您可以假设我已经阅读了以下关于此类主题的入门读物(实际上是多次):

http://adv-r.had.co.nz/Computing-on-the-language.html

但有些细节并没有完全让我印象深刻。

谢谢

【问题讨论】:

    标签: r function dataframe evaluation expression-evaluation


    【解决方案1】:

    我认为如果您将新名称作为字符值传入,这将更有意义。例如

    passMyName <-function(df, newColTitle) {
      df2 <- cbind(df, setNames(list(rep(NA, nrow(df))), newColTitle))
      return(df2)
    }
    
    randomDF <-data.frame(a=1:3, b=4:6, c=7:9)
    passMyName(randomDF , "myCustomColTitle")
    

    但如果你真的想使用未计算的表达式,你可以使用

    passMyName <-function(df, newColTitle) {
      newColTitle <- deparse(substitute(newColTitle))
      df2 <- cbind(df, setNames(list(rep(NA, nrow(df))), newColTitle))
      return(df2)
    }
    
    randomDF <-data.frame(a=1:3, b=4:6, c=7:9)
    passMyName(randomDF, myCustomColTitle)
    

    【讨论】:

    • 是的! setName() 你这辈子都去哪儿了?而且,是的,传递一个字符向量也是正确的方法
    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多