考虑以下R代码:
y1 <- dataset %>% dplyr::filter(W == 1)
这很有效,但这里似乎有些神奇。通常,当我们有foo(bar)
这样的表达式时,我们应该能够这样做:
baz <= bar
foo(baz)
但是,在显示的代码段中,我们无法评估W == 1
之外的dplyr::filter()
! W
不是已定义的变量。
发生了什么事?
答案 0 :(得分:2)
dplyr使用名为Non-standard Evaluation(NSE)的概念,使数据框参数中的列可以访问其函数,而无需引用或使用dataframe$column
语法。基本上:
<非常标准评估]是一个包罗万象的术语,这意味着它们不遵循通常的R评估规则。相反,它们捕获您键入的表达式并以自定义方式对其进行评估。1
在这种情况下,自定义评估会将给定的参数带到dplyr::filter
,并对其进行解析,以便W
可用于引用dataset$W
。之所以你不能接受该变量并在其他地方使用它是因为NSE仅适用于函数的范围。
NSE进行权衡:在构建使用函数修改其他函数的程序时,修改范围的函数不太安全和/或不可用:
这是为交互式使用而设计的功能与可编程安全的功能之间的一般张力的示例。使用substitute()的函数可能会减少输入,但是从另一个函数调用可能很困难。2
例如,如果你想编写一个使用相同代码的函数,但是将W == 1
替换为W == 0
(或者一些完全不同的过滤器),NSE会使得更难实现
2017年,tidyverse开始在tidy evaluation中构建解决方案。