了解dplyr select()中的非标准评估NSE和标准评估SE

时间:2015-01-12 14:24:17

标签: r lazy-evaluation dplyr

有人会非常友好地解释以下非标准评估和标准评估概念的差异吗?具体来说,为什么有些方法有效,有些则没有。

我希望这将成为其他人的路标(并节省时间)并增加文档/插图。此外,虽然我相信我对解释有很好的把握,但我确信有人应该能够比我生成/解释的更优雅和完整地回答这个问题。

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)

1 个答案:

答案 0 :(得分:0)

万一仍然有人碰到这个问题,我只想指出select_现在已被弃用,方法1、2、3现在都可以使用(产生两个“ Sepal.Width”,“ Sepal.Length”列)。 / p>

如果列中有符号列表而不是字符名称,则可以用!!!取消引用!和!以下直接来自select()的帮助文件。

# Unquoting ----------------------------------------

# Like all dplyr verbs, select() supports unquoting of symbols:
vars <- list(
  var1 = sym("cyl"),
  var2 = sym("am")
)
select(mtcars, !!!vars)

# For convenience it also supports strings and character
# vectors. This is unlike other verbs where strings would be
# ambiguous.
vars <- c(var1 = "cyl", var2 ="am")
select(mtcars, !!vars)
rename(mtcars, !!vars)