【问题标题】:dplyr .data pronoun vs "quosure" approachdplyr .data 代词与“quosure”方法
【发布时间】:2018-09-14 00:43:18
【问题描述】:

dplyr v0.7.0 中,引入了.data 代词,它允许我们使用字符串来引用变量。我只是好奇这种方法是否比“quosure”方法更受欢迎。例如,这是一种使用.data 代词的方法:

varname <- "gear"
data_pronoun_method_df <- dplyr::mutate(mtcars, new_col = .data[[varname]] + 2)

这与使用quosure 方法的示例进行了比较:

quo_varname <- rlang::quo(gear)
quo_method_df <- dplyr::mutate(mtcars, new_col = !! quo_varname + 2)

两种方法产生相同的输出:

data_pronoun_method_df

# mpg cyl  disp  hp drat    wt  qsec vs am gear carb new_col
# 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4       6
# 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4       6
# 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1       6
# 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1       5
# 5  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2       5
# 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1       5
# 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4       5
# 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2       6
# [ reached getOption("max.print") -- omitted 24 rows ]

all.equal(data_pronoun_method_df, quo_method_df)
# [1] TRUE

有什么真正的区别吗?两种方法的优缺点是什么?

【问题讨论】:

    标签: r dplyr tidyeval quosure


    【解决方案1】:

    .data 代词可用于解决 NSE,但它或多或少与 tidy eval 正交。其主要目的是确保在数据框中查找变量。如果它不存在,则会出现错误。这与可以获取本地对象(如果已定义)的裸名称形成对比:

    other <- 1e10
    transmute(mtcars, 2 * other)            # Succeeds erroneously
    transmute(mtcars, 2 * .data[["other"]]  # Fails
    

    使用.data 代词比仅仅明确引用数据框更可靠,因为数据可能被分组:

    group_by(mtcars, cyl) %>%
      transmute(2L * .data[["am"]])
    

    在该示例中,.data[["am"]] 表示由cyl 的级别定义的am 列的切片。

    编辑:为了完整起见,您可以使用 quosures 和 quasiquotation 来完成同样的事情。如果您使用空 env 作为环境创建符号的 quosure,则符号查找只有在数据框包含这样的列时才会成功:

    other <- 1e10
    quo <- new_quosure(quote(other), empty_env())
    transmute(mtcars, 2L * !!quo)  # Fails
    

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2021-04-17
      • 2018-06-03
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多