将名为arg的计算表达式传递给函数(R)中的函数

时间:2015-01-28 19:23:27

标签: r function dataframe evaluation expression-evaluation

我想扩展一个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添加一个新列,其中包含由函数定义的变量名,&#34; newColTitle&#34;。相反,我想将newColTitle评估为&#34; myCustomColTitle&#34;并将其作为此新列的命名标记传递,以便输出data.fram包含一个名为&#34; myCustomColTitle&#34;的新列。

这可能吗?也许可以通过substitute()deparse()quote()eval()paste()等等。您可以假设我已阅读以下有关此类型的主题(实际上几次):

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

但有些细节并没有完全坚持我。

由于

1 个答案:

答案 0 :(得分: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)