【问题标题】:Understanding non-standard evaluation NSE and standard evaluation SE in dplyr select()在 dplyr select() 中理解非标准评估 NSE 和标准评估 SE
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多