【问题标题】:Passing in unbound variables into R functions将未绑定的变量传递给 R 函数
【发布时间】:2020-12-04 00:52:43
【问题描述】:
> counties %>% select(state, county, population, poverty)
> # also written as
> select(counties , state, county, population, poverty)
> state
Error: object 'state' not found

大家好,

我有一个关于这里的 select 函数到底传递了什么的问题,statecountypopulationpoverty 实际上不是绑定到封闭环境的变量,而是第一个的列名元素。这使得传递给函数的参数实际上是有状态的。

通常,在其他语言中,这些键将作为字符串传入,所以我只是想知道我们应该如何推理和考虑这些未绑定的变量!或许另外,R 解释器/解析器如何在后台处理这个问题。

【问题讨论】:

  • 在data.frame的引用中,这些列名引用变量。如果您将 data.frame 附加到本地环境,您将能够直接引用它们。只要附上attach(counties),你就可以在本地环境中使用state作为变量名。
  • 一般不建议使用attach(),因为它可能会导致各种错误,主要是因为它会导致混淆命名空间。

标签: r dplyr arguments interpreter


【解决方案1】:

这是一个特定于 R 的非标准评估的案例。这是 R 中一个非常强大的概念,基本上意味着您在函数 select 中传递的内容不会被直接评估。相反,它接受未评估的参数,然后在数据帧的上下文中对其进行评估。

我建议您阅读有关此http://adv-r.had.co.nz/Computing-on-the-language.html 的高级 R 章节。

要进一步扩展,请看这个展示基本概念的示例:


expample_dataframe <- data.frame(
  foo = c(1:5),
  bar = c(10:14)
)

foo <- c("any" , "variable", "in", "global", "namespace")

print(foo) 
#> [1] "any"       "variable"  "in"        "global"    "namespace"

select_column <- function(data_frame, column_name){
  column_name <- substitute(column_name)
  eval(column_name, envir = data_frame)
}

select_column(expample_dataframe, foo)
#> [1] 1 2 3 4 5

foo
#> [1] "any"       "variable"  "in"        "global"    "namespace"

说明

substitute() 不计算函数的输入,即它将其引用为symbol。然后我们可以使用eval() 函数,它允许您评估某个命名空间内的某个调用/符号。是的,在 R 中,数据框是命名空间。因此

eval(column_name, envir = data_frame) 在数据帧的上下文中评估 column_name

这是 R 中许多函数的幕后发生的事情。

reprex package (v0.3.0) 于 2020-08-14 创建

【讨论】:

  • 感谢您为我指明了正确的方向!这正是它!很好的提醒,函数参数也是惰性求值的!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2011-02-26
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多