Dplyr,非标准评估和 Walrus 运算符和 curly-curly

2024-04-15

一个真正的问题。每当我需要编写 dplyr 函数时,我都会随机应变。 我知道卷曲运算符可以大大简化任务。

https://www.tidyverse.org/blog/2019/06/rlang-0-4-0/ https://www.tidyverse.org/blog/2019/06/rlang-0-4-0/

and

https://www.tidyverse.org/blog/2020/02/glue-strings-and-tidy-eval/ https://www.tidyverse.org/blog/2020/02/glue-strings-and-tidy-eval/

我不清楚何时使用简单的“=”和海象运算符“:=”。 例如,考虑帖子末尾的片段。 函数mean_by和mean_by2的不同只是因为前者依赖于“=”而后者依赖于“:=”,但结果是相同的。 但是,如果我尝试编写一个依赖 mutate 来添加新列的函数,并且在创建新列时使用“=”而不是“:=”,则会收到一条错误消息。 有人可以向我解释为什么会有这种差异吗?这是否意味着使用海象运算符比“=”更安全?

Thanks!

library(tidyverse)


mean_by <- function(data, by, var) {
  data %>%
    group_by({{ by }}) %>%
    summarise(avg = mean({{ var }}, na.rm = TRUE))
}



mean_by2 <- function(data, by, var) {
  data %>%
    group_by({{ by }}) %>%
    summarise(avg := mean({{ var }}, na.rm = TRUE))
}



add_new_col <- function(data, old_col, new_col){

    data %>%
        mutate({{new_col}}:={{old_col}})


}


iris %>% mean_by(Species, Sepal.Width)
#> # A tibble: 3 x 2
#>   Species      avg
#>   <fct>      <dbl>
#> 1 setosa      3.43
#> 2 versicolor  2.77
#> 3 virginica   2.97




iris %>% mean_by2(Species, Sepal.Width)
#> # A tibble: 3 x 2
#>   Species      avg
#>   <fct>      <dbl>
#> 1 setosa      3.43
#> 2 versicolor  2.77
#> 3 virginica   2.97



iris %>% add_new_col(Species, New_species)
#>     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species New_species
#> 1            5.1         3.5          1.4         0.2     setosa      setosa
#> 2            4.9         3.0          1.4         0.2     setosa      setosa
#> 3            4.7         3.2          1.3         0.2     setosa      setosa
#> 4            4.6         3.1          1.5         0.2     setosa      setosa
#> 5            5.0         3.6          1.4         0.2     setosa      setosa
#> 6            5.4         3.9          1.7         0.4     setosa      setosa
#> 7            4.6         3.4          1.4         0.3     setosa      setosa
#> 8            5.0         3.4          1.5         0.2     setosa      setosa
#> 9            4.4         2.9          1.4         0.2     setosa      setosa
#> 10           4.9         3.1          1.5         0.1     setosa      setosa
#> 11           5.4         3.7          1.5         0.2     setosa      setosa
#> 12           4.8         3.4          1.6         0.2     setosa      setosa
#> 13           4.8         3.0          1.4         0.1     setosa      setosa
#> 14           4.3         3.0          1.1         0.1     setosa      setosa
#> 15           5.8         4.0          1.2         0.2     setosa      setosa
#> 16           5.7         4.4          1.5         0.4     setosa      setosa
#> 17           5.4         3.9          1.3         0.4     setosa      setosa
#> 18           5.1         3.5          1.4         0.3     setosa      setosa
#> 19           5.7         3.8          1.7         0.3     setosa      setosa
#> 20           5.1         3.8          1.5         0.3     setosa      setosa
#> 21           5.4         3.4          1.7         0.2     setosa      setosa
#> 22           5.1         3.7          1.5         0.4     setosa      setosa
#> 23           4.6         3.6          1.0         0.2     setosa      setosa
#> 24           5.1         3.3          1.7         0.5     setosa      setosa
#> 25           4.8         3.4          1.9         0.2     setosa      setosa
#> 26           5.0         3.0          1.6         0.2     setosa      setosa
#> 27           5.0         3.4          1.6         0.4     setosa      setosa
#> 28           5.2         3.5          1.5         0.2     setosa      setosa
#> 29           5.2         3.4          1.4         0.2     setosa      setosa
#> 30           4.7         3.2          1.6         0.2     setosa      setosa
#> 31           4.8         3.1          1.6         0.2     setosa      setosa
#> 32           5.4         3.4          1.5         0.4     setosa      setosa
#> 33           5.2         4.1          1.5         0.1     setosa      setosa
#> 34           5.5         4.2          1.4         0.2     setosa      setosa
#> 35           4.9         3.1          1.5         0.2     setosa      setosa
#> 36           5.0         3.2          1.2         0.2     setosa      setosa
#> 37           5.5         3.5          1.3         0.2     setosa      setosa
#> 38           4.9         3.6          1.4         0.1     setosa      setosa
#> 39           4.4         3.0          1.3         0.2     setosa      setosa
#> 40           5.1         3.4          1.5         0.2     setosa      setosa
#> 41           5.0         3.5          1.3         0.3     setosa      setosa
#> 42           4.5         2.3          1.3         0.3     setosa      setosa
#> 43           4.4         3.2          1.3         0.2     setosa      setosa
#> 44           5.0         3.5          1.6         0.6     setosa      setosa
#> 45           5.1         3.8          1.9         0.4     setosa      setosa
#> 46           4.8         3.0          1.4         0.3     setosa      setosa
#> 47           5.1         3.8          1.6         0.2     setosa      setosa
#> 48           4.6         3.2          1.4         0.2     setosa      setosa
#> 49           5.3         3.7          1.5         0.2     setosa      setosa
#> 50           5.0         3.3          1.4         0.2     setosa      setosa
#> 51           7.0         3.2          4.7         1.4 versicolor  versicolor
#> 52           6.4         3.2          4.5         1.5 versicolor  versicolor
#> 53           6.9         3.1          4.9         1.5 versicolor  versicolor
#> 54           5.5         2.3          4.0         1.3 versicolor  versicolor
#> 55           6.5         2.8          4.6         1.5 versicolor  versicolor
#> 56           5.7         2.8          4.5         1.3 versicolor  versicolor
#> 57           6.3         3.3          4.7         1.6 versicolor  versicolor
#> 58           4.9         2.4          3.3         1.0 versicolor  versicolor
#> 59           6.6         2.9          4.6         1.3 versicolor  versicolor
#> 60           5.2         2.7          3.9         1.4 versicolor  versicolor
#> 61           5.0         2.0          3.5         1.0 versicolor  versicolor
#> 62           5.9         3.0          4.2         1.5 versicolor  versicolor
#> 63           6.0         2.2          4.0         1.0 versicolor  versicolor
#> 64           6.1         2.9          4.7         1.4 versicolor  versicolor
#> 65           5.6         2.9          3.6         1.3 versicolor  versicolor
#> 66           6.7         3.1          4.4         1.4 versicolor  versicolor
#> 67           5.6         3.0          4.5         1.5 versicolor  versicolor
#> 68           5.8         2.7          4.1         1.0 versicolor  versicolor
#> 69           6.2         2.2          4.5         1.5 versicolor  versicolor
#> 70           5.6         2.5          3.9         1.1 versicolor  versicolor
#> 71           5.9         3.2          4.8         1.8 versicolor  versicolor
#> 72           6.1         2.8          4.0         1.3 versicolor  versicolor
#> 73           6.3         2.5          4.9         1.5 versicolor  versicolor
#> 74           6.1         2.8          4.7         1.2 versicolor  versicolor
#> 75           6.4         2.9          4.3         1.3 versicolor  versicolor
#> 76           6.6         3.0          4.4         1.4 versicolor  versicolor
#> 77           6.8         2.8          4.8         1.4 versicolor  versicolor
#> 78           6.7         3.0          5.0         1.7 versicolor  versicolor
#> 79           6.0         2.9          4.5         1.5 versicolor  versicolor
#> 80           5.7         2.6          3.5         1.0 versicolor  versicolor
#> 81           5.5         2.4          3.8         1.1 versicolor  versicolor
#> 82           5.5         2.4          3.7         1.0 versicolor  versicolor
#> 83           5.8         2.7          3.9         1.2 versicolor  versicolor
#> 84           6.0         2.7          5.1         1.6 versicolor  versicolor
#> 85           5.4         3.0          4.5         1.5 versicolor  versicolor
#> 86           6.0         3.4          4.5         1.6 versicolor  versicolor
#> 87           6.7         3.1          4.7         1.5 versicolor  versicolor
#> 88           6.3         2.3          4.4         1.3 versicolor  versicolor
#> 89           5.6         3.0          4.1         1.3 versicolor  versicolor
#> 90           5.5         2.5          4.0         1.3 versicolor  versicolor
#> 91           5.5         2.6          4.4         1.2 versicolor  versicolor
#> 92           6.1         3.0          4.6         1.4 versicolor  versicolor
#> 93           5.8         2.6          4.0         1.2 versicolor  versicolor
#> 94           5.0         2.3          3.3         1.0 versicolor  versicolor
#> 95           5.6         2.7          4.2         1.3 versicolor  versicolor
#> 96           5.7         3.0          4.2         1.2 versicolor  versicolor
#> 97           5.7         2.9          4.2         1.3 versicolor  versicolor
#> 98           6.2         2.9          4.3         1.3 versicolor  versicolor
#> 99           5.1         2.5          3.0         1.1 versicolor  versicolor
#> 100          5.7         2.8          4.1         1.3 versicolor  versicolor
#> 101          6.3         3.3          6.0         2.5  virginica   virginica
#> 102          5.8         2.7          5.1         1.9  virginica   virginica
#> 103          7.1         3.0          5.9         2.1  virginica   virginica
#> 104          6.3         2.9          5.6         1.8  virginica   virginica
#> 105          6.5         3.0          5.8         2.2  virginica   virginica
#> 106          7.6         3.0          6.6         2.1  virginica   virginica
#> 107          4.9         2.5          4.5         1.7  virginica   virginica
#> 108          7.3         2.9          6.3         1.8  virginica   virginica
#> 109          6.7         2.5          5.8         1.8  virginica   virginica
#> 110          7.2         3.6          6.1         2.5  virginica   virginica
#> 111          6.5         3.2          5.1         2.0  virginica   virginica
#> 112          6.4         2.7          5.3         1.9  virginica   virginica
#> 113          6.8         3.0          5.5         2.1  virginica   virginica
#> 114          5.7         2.5          5.0         2.0  virginica   virginica
#> 115          5.8         2.8          5.1         2.4  virginica   virginica
#> 116          6.4         3.2          5.3         2.3  virginica   virginica
#> 117          6.5         3.0          5.5         1.8  virginica   virginica
#> 118          7.7         3.8          6.7         2.2  virginica   virginica
#> 119          7.7         2.6          6.9         2.3  virginica   virginica
#> 120          6.0         2.2          5.0         1.5  virginica   virginica
#> 121          6.9         3.2          5.7         2.3  virginica   virginica
#> 122          5.6         2.8          4.9         2.0  virginica   virginica
#> 123          7.7         2.8          6.7         2.0  virginica   virginica
#> 124          6.3         2.7          4.9         1.8  virginica   virginica
#> 125          6.7         3.3          5.7         2.1  virginica   virginica
#> 126          7.2         3.2          6.0         1.8  virginica   virginica
#> 127          6.2         2.8          4.8         1.8  virginica   virginica
#> 128          6.1         3.0          4.9         1.8  virginica   virginica
#> 129          6.4         2.8          5.6         2.1  virginica   virginica
#> 130          7.2         3.0          5.8         1.6  virginica   virginica
#> 131          7.4         2.8          6.1         1.9  virginica   virginica
#> 132          7.9         3.8          6.4         2.0  virginica   virginica
#> 133          6.4         2.8          5.6         2.2  virginica   virginica
#> 134          6.3         2.8          5.1         1.5  virginica   virginica
#> 135          6.1         2.6          5.6         1.4  virginica   virginica
#> 136          7.7         3.0          6.1         2.3  virginica   virginica
#> 137          6.3         3.4          5.6         2.4  virginica   virginica
#> 138          6.4         3.1          5.5         1.8  virginica   virginica
#> 139          6.0         3.0          4.8         1.8  virginica   virginica
#> 140          6.9         3.1          5.4         2.1  virginica   virginica
#> 141          6.7         3.1          5.6         2.4  virginica   virginica
#> 142          6.9         3.1          5.1         2.3  virginica   virginica
#> 143          5.8         2.7          5.1         1.9  virginica   virginica
#> 144          6.8         3.2          5.9         2.3  virginica   virginica
#> 145          6.7         3.3          5.7         2.5  virginica   virginica
#> 146          6.7         3.0          5.2         2.3  virginica   virginica
#> 147          6.3         2.5          5.0         1.9  virginica   virginica
#> 148          6.5         3.0          5.2         2.0  virginica   virginica
#> 149          6.2         3.4          5.4         2.3  virginica   virginica
#> 150          5.9         3.0          5.1         1.8  virginica   virginica

Created on 2020-04-18 by the reprex package https://reprex.tidyverse.org (v0.3.0)


经验法则很简单:如果您使用任何形式准方程式 https://rlang.r-lib.org/reference/topic-inject.html#injection-in-other-languages (i.e., !! and {{运算符)在赋值的左侧,您需要海象运算符。

s = sym("abc")

## Quasi-quotation on the left-hand of the assignment
iris %>% mutate( !!s = Petal.Length * Petal.Width )    # Error: unexpected '='

## Using walrus fixes the issue
iris %>% mutate( !!s := Petal.Length * Petal.Width )   # Works, creates column abc

## No quasi-quotation on the left-hand side, so = is enough
iris %>% mutate( s = Petal.Length * Petal.Width )      # Also works, creates column s

请注意,海象运算符仅适用于支持准引用的函数。一般情况下不支持:

list( a := 5 )           ## Error
rlang::list2( a := 5 )   ## Works
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dplyr,非标准评估和 Walrus 运算符和 curly-curly 的相关文章

随机推荐

  • .NET Framework 全局程序集缓存在哪里?

    我安装了 VS2010 和 NET 4 0 然后编译了一个程序集并使用可用的 exe 运行 gacutil ProgramFiles Microsoft SDKs Windows v7 0A Bin NETFX 4 0 Tools 可执行文
  • 如何在 R 中重新格式化表格?

    我加载了一个这样的表 V1 V2 V3 pat1 1 2 pat1 3 1 pat1 4 2 pat2 3 3 pat3 1 4 pat3 2 3 我需要将其格式化为如下所示 其中 V1 表示行 V2 表示列 V3 中的值 1 2 3 4
  • Android 中未接来电的广播接收器

    有谁知道未接来电的意图是什么 实际上 我想在我的应用程序中发送有关未接来电和来电的短信 您需要使用 ContentObserver public class MissedCallsContentObserver extends Conten
  • fork 后调试子进程(配置了 follow-fork-mode 子进程)

    我正在开发一个应用程序 父级分叉子级来处理某些任务 我遇到一个问题 我已将 gdb 配置为 follow fork mode 子级 但在 fork 后 到达断点后 它发送 SIGTRAP 但子级以某种方式终止并向父级发送 SIGCHLD 我
  • 数据表行切换选项

    我的问题 我正在开发一个与 DataTableJS 相关的项目 我需要一个行分组功能 它与分组行分开 只是我想在下面的切换中显示相关的表行内容城市名 我到底在寻找什么 我的演示代码 document ready function var t
  • Swagger 无法生成 HTTP“PATCH”的文档

    我已遵循以下内容博客条目 http kingsfleet blogspot co uk 2014 02 transparent patch support in jax rs 20 html http Transparent 20PATCH
  • 在 htaccess 文件中使用公用文件夹时的多种语言

    我有这个 htacces文件我很喜欢它 但是如何向它添加多语言 所以它明白localhost en 不是文件或文件夹 现在它使用公共文件夹作为 根 所以localhost public 如果我想这样做 那太好了 我仍然使用公共文件夹作为根目
  • JetBrains(IntelliJ、PhpStorm、WebStorm ...)带有 SSH 密钥的私有 git 存储库

    我的新 Web 服务器需要使用 RSA 2048 密钥进行身份验证 因此我生成了一个密钥 我将ir rsa and id rsa pub我的主文件夹中的文件 ssh Windows 10 但是当我使用 cvs 注释 用于拉或推 时 我收到错
  • 通过查找按组快速 data.table 分配多列

    我一直在寻找规范的方法来完成我正在尝试的事情 但我似乎不太幸运地获得快速而优雅的工作 简而言之 我有一个包含多个值列的大表 并且希望将每个值乘以查找表中的相应因子 我不知道如何动态传递我想要乘以查找值的列 或者如何在基本表达式之外引用查找值
  • C语言中如何清空数组?

    char x 1000 x hello 我会用什么来清除内容x 我无法重新初始化它 请使用strcpy x 0 or free 您不能将任何内容分配给您的变量数组x是 因此 任何以x 是错的 第二 hello 不是字符串 它是一个多字符文字
  • Google Analytics 3.0 身份验证流程

    EDIT 最初这个问题问我如何仅使用我的 API 密钥通过 Google Analytics API 进行身份验证 作为弗拉特科指出 https stackoverflow com a 13834210 697449 这是不可能的 现在我只
  • 为什么 Spark 在字数统计时速度很快? [复制]

    这个问题在这里已经有答案了 测试用例 Spark 在 20 秒以上对 6G 数据进行字数统计 我明白映射减少 FP and stream编程模型 但无法弄清楚字数统计的速度如此惊人 我认为这种情况下是I O密集型计算 不可能在20秒以上扫描
  • Mondrian OLAP 引擎 + Olap4j 的数据呈现

    我正在对一个应用程序进行一些规划 该应用程序使用 Mondrian OLAP 引擎和 Olap4j 并且应该向用户呈现 显示数据 我了解所有后端内容 但我不确定应该如何在视图层中显示数据 例如 olap4j 有一个格式化程序 可以将 SEL
  • 将 cURL 请求转换为 Guzzle

    我正在尝试使用Guzzle而不是直接使用cURL来实现HTTP请求 我如何使用 Guzzle 发出相同类型的请求 或者我应该坚持使用 cURL ch curl init Set the URL curl setopt ch CURLOPT
  • 如何将tools.jar添加为sbt中的“动态依赖项”。是否可以?

    我需要在我的项目中使用tools jar 但是将其打包在jar中没有多大意义 因为用户已经拥有它 那么 是否可以将其用作 动态依赖项 意思是 我希望我的代码compile通过使用tools jar文件发现于my JAVA HOME 但我不希
  • 使用 WinApi 函数在 FMX 画布上绘图

    这个问题看起来很简单 使用 VCL 可以正常工作 图像是 VCL 上的 TImage procedure TFormMain btnDrawBackgroundClick Sender TObject var theme HTHEME be
  • 无法在 android studio 中加载包装器属性

    请帮助我 当我在 android studio 中创建一个新项目时出现错误 无法从 C Users baren AndroidStudioProjects ToyaGarage gradle wrapper gradle wrapper p
  • 无法在 Android Studio 中的项目结构上添加模块

    结构项目窗口不显示所有选项 我无法添加库或模块 Check the image And this is how it should look with all the options 我尝试修复重新安装 android studio 但没有
  • 使用 CGRectZero 在 UIView 类或子类上调用 initWithFrame 意味着什么?

    我见过调用的代码initWithFrame of a UIView子类 例如UILabel with CGRectZero一切似乎都进展顺利 实例化一个是什么意思UIView具有 2D 点的子类 这似乎是CGRectZero is 它只是意
  • Dplyr,非标准评估和 Walrus 运算符和 curly-curly

    一个真正的问题 每当我需要编写 dplyr 函数时 我都会随机应变 我知道卷曲运算符可以大大简化任务 https www tidyverse org blog 2019 06 rlang 0 4 0 https www tidyverse