0

我想扩展一个 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

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

谢谢

4

1 回答 1

4

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

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)
于 2015-01-28T19:29:33.740 回答