问题描述
<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
,state
,county
和population
实际上不是绑定到封闭的变量环境,而是第一个元素的列名。这使得传递给函数的参数实际上是有状态的。
通常,在其他语言中,这些键将作为字符串传递,所以我只是想知道我们应该如何推理和考虑这些未绑定的变量!也许另外,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创建