【发布时间】:2015-03-10 08:22:31
【问题描述】:
有人能解释一下以下非标准评估和标准评估概念的区别吗?具体来说,为什么某些方法有效而其他方法无效。
我希望这将成为其他人的路标(并节省他们的时间)并增加文档/插图。此外,虽然我相信我对解释有很好的把握,但我确信有人应该能够比我提出/解释的更优雅、更完整地回答这个问题。
library(dplyr)
myCols <- c("Sepal.Width", "Sepal.Length")
#######################################################################
# Non-Standard Evaluation (NSE)
#######################################################################
# METHOD 1: Works as expected
select(iris, Sepal.Width, Sepal.Length)
# METHOD 2: Throws error - must reolve to integer column positions.
select(iris, myCols)
# METHOD 3: Works as expected
select(iris, one_of(myCols))
#######################################################################
# Standard Evaluation (SE)
#######################################################################
# METHOD 4: Returns just Sepal.Width NOT Sepal.Length
select_(iris, myCols)
# METHOD 5: Throws error - must reolve to integer column positions.
select_(iris, ~myCols)
# METHOD 6: Works as expected
select_(iris, .dots = myCols)
【问题讨论】:
-
您能否详细说明您在现有的小插曲中缺少的具体内容,特别是 the vignette on NSE?
-
@KonradRudolph 对于初学者来说,
METHOD 5引发错误与METHOD 6背后的why 怎么样。 -
为什么不看看
~myCols的结果是什么?您似乎认为它不是,因为select的文档非常清楚select_期望的参数。 -
更多有效的方法包括例如
select_(iris, ~match(names(iris), myCols, nomatch=0))或select_(iris, gsub('\"', '', deparse(myCols)))。 -
@shadow 我不知道你的评论是否认真。
标签: r lazy-evaluation dplyr