【问题标题】:How to find object name passed to function如何查找传递给函数的对象名称
【发布时间】:2021-12-24 20:50:42
【问题描述】:

我有一个函数,它接受一个数据框及其列并以各种方式处理它(为简单起见,省略了)。我们可以将列名作为参数放入或直接在函数参数中转换列(如here)。我需要找出函数中传递了哪些对象。

可重现的例子:

df <- data.frame(x= 1:10, y=1:10)

myfun <- function(data, col){
col_new <- eval(substitute(col), data)
# magic part
object_name <- ...
# magic part
plot(col_new, main= object_name)
}

例如,myfun(data= df, x*x) 的预期输出是绘图 plot(df$x*df$x, main= "x")。所以标题是x,而不是x*x。到目前为止,我得到的是:

myfun <- function(data, col){
colname <- tryCatch({eval(substitute(col))}, error= function(e) {geterrmessage()})
colname <- gsub("' not found", "", gsub("object '", "", colname))
plot(eval(substitute(col), data), main= colname)
    }

这个函数给出了预期的输出,但必须有一些更优雅的方法来找出输入所指的对象。答案必须是基数 R。

【问题讨论】:

  • 您要退回什么? “x”作为字符串?作为一个符号?
  • @Adam 作为字符串。第二个函数返回预期的输出。
  • @G.Grothendieck 我编辑了问题。

标签: r function object


【解决方案1】:

使用替代获取作为 col 传递的表达式,然后使用 eval 和 all.vars 获取值和名称。

myfun <- function(data, col){
  s <- substitute(col)
  plot(eval(s, data), main = all.vars(s), type = "o", ylab = "")
}
myfun(df, x * x)

另一种可能性是通过一个片面的公式。

myfun2 <- function(formula, data){
  plot(eval(formula[[2]], data), main = all.vars(formula), type = "o", ylab = "")
}
myfun2(~ x * x, df)

【讨论】:

  • 太棒了!神奇的部分是 all.vars()!对问题中的可重现示例使用 myfun(df, x*x) 现在可以得到预期的输出。
【解决方案2】:

rlang 包在您掌握它后会非常强大。这样的事情做你想做的事吗?

library(rlang)

myfun <- function (data, col){
  .col <- enexpr(col)
  
  unname(sapply(call_args(.col), as_string))
}

这会返回“wt”列。

myfun(mtcars, as.factor(wt))    
# [1] "wt" 

我不确定您的用例,但这适用于多个输入。

myfun(mtcars, sum(x, y))
# [1] "x" "y"

最后,您甚至可能不需要这样做,而是存储表达式并直接对数据进行操作。 tidyeval 框架也可以提供帮助。

【讨论】:

  • 我们可以在 R 基础中做到这一点吗?请参阅已编辑的问题。
  • @machine 可能是的,但我从不这样做,而且不太熟悉。希望其他人可以回答这个问题。
  • +1,谢谢!我想要base R,因为我正在开发一个包并且不希望包含不必要的包。
  • 我知道了。我会说,rlang 无处不在,因此它不会成为依赖项的巨大障碍。我也这样做,但尽量避免更晦涩和不太常见的包。除了那些在高度受限的环境中使用 R 的人之外,基本上每个人都会安装 rlang。要考虑的事情。包是 R 生态系统的重要组成部分。取决于它们中的太多会膨胀你自己的包,但我也不确定使用 none 是正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多