r - 理解dplyr select()中的非标准评估NSE和标准评估SE

标签 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)

最佳答案

如果有人仍然遇到这个问题,我只是想注意 select_ 现在已被弃用,方法 1、2、3 现在都可以工作(生成两个“Sepal.Width”、“Sepal.Length”列)。

如果您有符号列表而不是列的字符名称,则可以使用 !!! 取消引用它们!和 !!。以下内容直接来自 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)

关于r - 理解dplyr select()中的非标准评估NSE和标准评估SE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27904185/

相关文章:

r - 无法将 tidyselect `everything()` 与 `group_by()` 和 `fill()` 结合使用

R错误 "sum not meaningful for factors"

haskell - 懒惰和 I/O 如何在 Haskell 中协同工作?

loops - 为什么 Haskell 序列函数不能惰性或递归单子(monad)函数不能惰性

haskell - 这里真的需要单位上的爆炸图案吗?

r - 对于每一行,找到最接近指定值的列

通过 dplyr group_by 运行列表并每次进行总结和变异

重新排列数据框中的行序列

r - 如何从 "summary.glht"中提取 p 值

r - 从入院之日起计算生存时间