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

7

请问有人能够解释以下非标准评估和标准评估概念的区别吗?特别是,为什么一些方法可行而其他方法不可行。

我希望这将成为他人的指南(节省他们的时间)并且增强文档/小册子。此外,虽然我相信我对解释有一个相当好的掌握,但我肯定有人应该能够比我更优雅和全面地回答这个问题。

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)

你能详细说明一下,你在现有的小品文中具体缺少什么,特别是关于NSE的小品文? - Konrad Rudolph
@KonradRudolph 首先,我们来讨论一下METHOD 5抛出错误和METHOD 6不抛出错误的原因。 - JasonAizkalns
1
你为什么不看一下 ~myCols 的结果呢?你似乎假设它是某些东西,而实际上它并不是那样的,因为 select 的文档已经很清楚地指出了 select_ 函数所期望的参数。 - Konrad Rudolph
2
更多可行的方法包括例如 select_(iris, ~match(names(iris), myCols, nomatch=0)) 或者 select_(iris, gsub('\"', '', deparse(myCols))) - shadow
@shadow 我无法确定你的评论是认真的还是开玩笑的。 - Konrad Rudolph
显示剩余2条评论
1个回答

0
如果有人仍然遇到这个问题,我想指出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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接