将未绑定的变量传递给R函数

问题描述

<div class="parentdiv">
    <div class="left-area">
        <img src="img/noimage.png" alt="no image available">
        <p class="text1">Text1</p>
    </div>
    <div class="right-area">
        <div class="btn_area">
            <a href="#" class="text2">Text2</a>
            <a href="#" class="text3">Text3</a>
        </div>
    </div>
</div>

大家好,

我有一个问题要问,究竟究竟将什么传递到选择函数中,> counties %>% select(state,county,population,poverty) > # also written as > select(counties,state,poverty) > state Error: object 'state' not found statecountypopulation实际上不是绑定到封闭的变量环境,而是第一个元素的列名。这使得传递给函数的参数实际上是有状态的。

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

解决方法

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

我建议您阅读此http://adv-r.had.co.nz/Computing-on-the-language.html上的Advanced 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创建