猿问

将data.framework列名传递给函数

将data.framework列名传递给函数

我试图编写一个函数来接受data.framework(x)和column从那里。函数在x上执行一些计算,然后返回另一个data.framework。我坚持使用最佳实践方法将列名传递给函数。

两个极小例子fun1fun2下面生成所需的结果,能够在x$column,使用max()举个例子。然而,两者都依赖于表面上(至少对我来说)不雅的东西。

  1. 打电话给

    substitute()

    也有可能

    eval()

  2. 需要将列名作为字符向量传递。


fun1 <- function(x, column){
  do.call("max", list(substitute(x[a], list(a = column))))}fun2 <- function(x, column){
  max(eval((substitute(x[a], list(a = column)))))}df <- data.frame(B = rnorm(10))fun1(df, "B")fun2(df, "B")

我希望能够将这个函数称为fun(df, B)例如。我已考虑但尚未尝试的其他选择:

  • 经过,穿过

    column

    作为列号的整数。我想这样可以避免

    substitute()

    ..理想情况下,该函数可以接受任何一个。
  • with(x, get(column))

    ,但是,即使它有效,我认为这仍然需要

    substitute

  • 利用

    formula()

    match.call()

    这两个我都没有太多的经验。

子问题*是do.call()优先于eval()?


holdtom
浏览 381回答 3
3回答

摇曳的蔷薇

您可以直接使用列名:df&nbsp;<-&nbsp;data.frame(A=1:10,&nbsp;B=2:11,&nbsp;C=3:12)fun1&nbsp;<-&nbsp;function(x,&nbsp;column){ &nbsp;&nbsp;max(x[,column])}fun1(df,&nbsp;"B")fun1(df,&nbsp;c("B","A"))没有必要使用替代物,val等。您甚至可以将所需的函数作为参数传递:fun1&nbsp;<-&nbsp;function(x,&nbsp;column,&nbsp;fn)&nbsp;{ &nbsp;&nbsp;fn(x[,column])}fun1(df,&nbsp;"B",&nbsp;max)或者,使用[[还可以一次选择一个列:df&nbsp;<-&nbsp;data.frame(A=1:10,&nbsp;B=2:11,&nbsp;C=3:12)fun1&nbsp;<-&nbsp;function(x,&nbsp;column){ &nbsp;&nbsp;max(x[[column]])}fun1(df,&nbsp;"B")

慕尼黑8549860

就我个人而言,我认为将列作为字符串传递是非常丑陋的。我喜欢做这样的事情:get.max&nbsp;<-&nbsp;function(column,data=NULL){ &nbsp;&nbsp;&nbsp;&nbsp;column<-eval(substitute(column),data,&nbsp;parent.frame()) &nbsp;&nbsp;&nbsp;&nbsp;max(column)}这将产生:>&nbsp;get.max(mpg,mtcars)[1]&nbsp;33.9>&nbsp;get.max(c(1,2,3,4,5))[1]&nbsp;5请注意data.framework的规范是如何可选的。您甚至可以使用列的函数:>&nbsp;get.max(1/mpg,mtcars)[1]&nbsp;0.09615385
随时随地看视频慕课网APP
我要回答