何时使用 rlang::ensym() 而不是 rlang::sym()?

2024-03-03

我从文档中可以看到rlang::enquo() and rlang::quo()用于不同的上下文。因此,我用了rlang::enysm()最近在函数声明中(见下文)。然而,在另一个 SE 函数调用中,我收到了一个意外的错误,我猜这与惰性求值有关(如果我这样做,该错误就会消失)force(x) in f_enysm())。但似乎我也可以通过简单地使用来解决这个问题sym(x)代替ensym(x) since x是一个不传达任何有关环境信息的字符串(与 quosures 相反)。

这样安全吗?

如果是的话,我不知道我应该选择什么时候ensym() over sym拟议的用途似乎与所使用的术语不一致quo() / enquo(), expr() / enexpr() etc.

library(rlang)
f_ensym <- function(data, x, fun) {
  x <- fun(x)
  head(dplyr::arrange(data, !!x))
}
f_ensym(mtcars, "cyl", sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1


f_sym <- function(data, x) {
  x <- sym(x)
  head(dplyr::arrange(data, !!x))
}

g <- function(data, x, fun) {
  fun(data, x)
}

g(mtcars, "cyl", f_ensym)
#> Error in fun(x): argument "fun" is missing, with no default
g(mtcars, "cyl", f_sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1

# If I remove one level, I don't get the problematic behaviour.
f <- function(data, x, fun) {
  x <- fun(x)
  head(dplyr::arrange(data, !!x))
}
f(mtcars, "cyl", sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
f(mtcars, "cyl", ensym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1

另外,如果我删除中间函数f_sym() and f_enysm()并直接致电f(),我不明白有问题的行为。

f <- function(data, x, fun) {
  x <- fun(x)
  head(dplyr::arrange(data, !!x))
}
f(mtcars, "cyl", sym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
f(mtcars, "cyl", ensym)
#>    mpg cyl  disp hp drat    wt  qsec vs am gear carb
#> 1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#> 2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#> 3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#> 4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#> 5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#> 6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1

The ensym可以采用带引号和不带引号的参数

f_ensym(mtcars, "cyl")
f_ensym(mtcars, cyl)

根据 OP 帖子中更新的示例,sym获取字符串对象g仅采用三个参数,并且fun它的一部分是'f_ensymwhich also have afun` 没有被传入。我们还可以对此提出更多的论据

g <- function(data, x, fun, fun2) {
     fun(data, x, fun2)
  }

g(mtcars, "cyl", f_ensym, sym)
#   mpg cyl  disp hp drat    wt  qsec vs am gear carb
#1 22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
#2 24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
#3 22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
#4 32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
#5 30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
#6 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 rlang::ensym() 而不是 rlang::sym()? 的相关文章

随机推荐

  • 如何更改文本块背景?

    这是我的xaml structure
  • 如何防止.exe类型文件在网站上传?

    假设我们有一个 example exe 文件 我们首先将该文件放入一个新文件夹中 然后使用任何压缩软件压缩该文件夹 我们可以阻止压缩文件夹在网站中上传吗 我们怎样才能做到这一点 你不能prevent它 因为在提交之前你无法知道浏览器将要提交
  • 为什么我获得了未分配内存的读写权限?

    我对下面代码片段的行为感到困惑 我已经声明了一个 char 指针并将其指向分配大小 1 sizeof char 的内存位置 char src src char malloc 1 sizeof char strcpy src Copy tex
  • 对 Rhino Mocks 中的方法调用进行计数

    所以 我想用比 An Ounce 或 At Least Once 更具体的方法来计算 Rhino Mocks 中的方法调用 有什么机制可以做到这一点吗 诀窍是使用 Repeat Times n 其中 n 是次数 令人惊讶的是 即使该方法的调
  • 如何在活动之前增加 Azure 数据工厂中的参数?

    我正在访问一个 RESTful API 该 API 使用 HTTP 连接器以 50 组为一组进行分页 REST 连接器似乎不支持客户端证书 因此我无法在其中使用分页 我有一个名为的管道变量SkipIndex默认为 0 在 Until 循环内
  • 行为 3 中如何在上下文之间进行通信?

    我无法再在版本 3 中使用 getMainContext 和 getSubcontext alias 版本 3 中上下文之间的通信方式是什么 上下文特征是唯一的方式吗 behat yml default suites guest featu
  • Android 中的电话选择器 api

    我正在尝试使用电话选择器 API 获取电话号码 但得到空响应 这是我的代码 GoogleApiClient googleApiClient new GoogleApiClient Builder this addApi Auth CREDE
  • Schema.org 中的产品列表

    我读了这个谷歌文档 https developers google com search docs data types products 它说我们不使用列表中的产品 那么对于产品列表 具有多页的类似产品类别 如 鞋子 建议使用哪种模式 我
  • 静态和粘性固定标题转换故障

    我创建了一个基于滚动的粘性标题 但有两个问题 上下滚动时 背景有跳跃 我希望你 明白我的意思 有时两个标题 div 一起出现 我该如何解决这个问题 提前致谢 JSFiddle 演示 http jsfiddle net ezBXc CSS m
  • 在 swift 中使用 NSClassFromString 实例化嵌套类

    我有一个如下定义的嵌套类 objc class A objc class B 我需要实例化A B using NSClassFromString 我能够在简单的课程中做到这一点A但是当我附加到NSClassFromString参数 Bstr
  • 将 GitLab 与 TeamCity 集成

    从 GitLab 7 6 或更高版本开始 有一个新选项可以直接从 GitLab 项目使用 TeamCity 在设置中有这样的消息 Teamcity 中的构建配置必须使用构建格式编号 build vcs number 您还需要配置对所有 分支
  • Android:支持多屏

    我正在尝试在Android 中制作一个应用程序 我希望它应该能够在不同屏幕尺寸的多部手机上运行 所以我研究了支持开发者多屏 http developer android com guide practices screens support
  • symfony 中“无法设置验证器上的enable_annotations,因为注释支持被禁用”

    我刚刚创建了一个包 成功 当我准备通过控制台创建一个实体时 发生了这种情况 也使用clear cache 逻辑异常 验证器上的 enable annotations 不能设置为注释 支持被禁用 mi config yml 看起来像 fram
  • 使用 OAuth 和单页应用程序实施 Web API

    我们正在开发一个 API 和一个单页应用程序 这是它未来更可能的使用者之一 我们已经开始使用 Web API 并且基本上实现了一个与 John Papa 在他的pluralsight 课程中制作的系统非常相似的系统 名为 使用 HTML5
  • 尝试使用 Fluent-ffmpeg 将帧提取到内存

    我正在尝试使用 FFmpeg 将帧直接提取到内存中 以节省将帧写入磁盘的时间 因为我不需要它 我尝试运行this https stackoverflow com questions 62050534 how to read video fr
  • 使用 $(GitVersion.NuGetVersion) 标记源会创建带有变量名称而不是值的标签

    成功构建后 将标签格式配置为 GitVersion NuGetVersion 结果标签设置为 GitVersion NuGetVersion 不是该变量的实际扩展值 在构建输出日志记录中 有 2 个部分 计划 构建和完成构建 据推测 一旦构
  • Pandas 计算列中负值的序列

    我在 Pandas Dataframe 列 B 中的值可以是正数或负数 data 5889 25 738 0 5896 5 49 0 5897 5 130 0 5899 5 266 0 5903 75 126 0 5903 75 512 0
  • 快速停止 CABasicAnimation

    我使用 CABasicAnimation 来制作脉冲帧等动画视图 有代码 extension UIView animate the border width func animateBorderWidth toValue CGFloat d
  • Pycharm 中的 Jupyter - 当数据框太宽时,数据框不显示,不出现水平滚动选项

    当我在 Pycharm 中使用 jupyter 笔记本从单元格输出数据帧时 除非数据帧的宽度适合窗口 否则它不会显示 因此 在宽度比窗口宽度宽的情况下 只会产生一条白线 而我期望显示部分数据框以及水平滚动条 运行以下命令 import pa
  • 何时使用 rlang::ensym() 而不是 rlang::sym()?

    我从文档中可以看到rlang enquo and rlang quo 用于不同的上下文 因此 我用了rlang enysm 最近在函数声明中 见下文 然而 在另一个 SE 函数调用中 我收到了一个意外的错误 我猜这与惰性求值有关 如果我这样