匿名函数中的 rlang::sym

2023-12-23

我最近注意到rlang::sym似乎不适用于匿名函数,我不明白为什么。这是一个例子,它非常笨拙和丑陋,但我认为它说明了这一点

require(tidyverse)
data <- tibble(x1 = letters[1:3],
               x2 = letters[4:6],
               val = 1:3)

get_it <- function(a, b){
    data %>%
        mutate(y1 = !!rlang::sym(a)) %>%
        mutate(y2 = !!rlang::sym(b)) %>%
        select(y1, y2, val)
}
get_it("x1", "x2")

这定义了一些玩具数据和一个(可怕的)函数,该函数本质上根据列名称重命名列。现在我可以对 a 和 b 的不同组合做同样的事情:

d <- tibble(x = c("x1", "x2"),
            y = c("x2", "x1"))
d %>% mutate(tmp = map2(x, y, get_it))

但是,如果我尝试使用匿名函数执行完全相同的操作,则它不起作用:

d %>% mutate(tmp = map2(x, y, function(a, b){
data %>%
    mutate(y1 = !!rlang::sym(a)) %>%
    mutate(y2 = !!rlang::sym(b)) %>%
    select(y1, y2, val)
}))

这失败了object 'a' not found尽管功能完全相同,但这里是匿名的。谁能解释为什么?


问题不是匿名函数,而是运算符优先级!!。帮助页面!!指出

这 !!运算符取消引用其参数。它被评估立即地在周围的环境中。

这意味着当您编写复杂的 NSE 表达式时,例如select inside mutate,取消引用将发生在整个表达式的环境中。正如 @lionel 所指出的,取消引用优先于其他事情,例如创建匿名函数环境。

在你的情况下!!取消引用是针对外部完成的mutate(),然后尝试查找列x1 inside d, not data。有两种可能的解决方案:

1)拉取涉及的表达式!!进入一个独立的函数(正如您在问题中所做的那样):

res1 <- d %>% mutate(tmp = map2(x, y, get_it))

2) 更换!! with eval延迟表达式求值:

res2 <- d %>% mutate(tmp = map2(x, y, function(a, b){
  data %>%
    mutate(y1 = eval(rlang::sym(a))) %>%
    mutate(y2 = eval(rlang::sym(b))) %>%
    select(y1, y2, val)
}))

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

匿名函数中的 rlang::sym 的相关文章

  • 如何在 R 中抓取受保护的页面(https 链接)(使用 XML 包中的 readHTMLTable)?

    关于如何使用 XML 包中的 readHTMLTable 有很好的答案 我使用常规 http 页面做到了这一点 但是我无法解决 https 页面的问题 我正在尝试阅读该网站上的表格 网址字符串 library RTidyHTML libra
  • 循环更改多个数据帧

    例如 我有这三个数据集 就我而言 它们更多并且有很多变量 data frame1 lt data frame a c 1 5 3 3 2 b c 3 6 1 5 5 c c 4 4 1 9 2 data frame2 lt data fra
  • 使用 R 中绘制的标准误差创建条形图

    我试图找到在 R 中创建条形图并显示标准错误的最佳方法 我看过其他文章 但我无法弄清楚与我自己的数据一起使用的代码 之前没有使用过 ggplot 这似乎是最常用的方法 而 barplot 不与数据框合作 我需要在两种情况下使用它 我为此创建
  • 如何将美国人口普查局的州级形状文件合并为全国性形状

    人口普查局不提供全国范围内公共使用微数据区域的形状文件 美国社区调查中可用的最小地理区域 我尝试用几种不同的方法将它们结合起来 但即使是消除重复标识符的方法一旦到达加利福尼亚州也会崩溃 我是在做一些愚蠢的事情还是需要一个困难的解决方法 下面
  • 与 data.table 合并时防止重复列

    我有两个数据表 它们的列名部分相似 dfA lt read table text A B C D E F G iso year matchcode 1 0 1 1 1 0 1 0 NLD 2010 NLD2010 2 1 0 0 0 1 0
  • 自动化 RStudio 处理 RMarkdown?

    我有一个 RMarkdown 文件 用于生成漂亮的 HTML 报告 问题是 我希望能够自动化它 以便它可以在无头服务器上运行 因此 不会有人启动 Rstudio 并按下 knithtml 按钮 而且 Rstudio 似乎正在做很多额外的魔法
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • dplyr :过滤一系列行(在一列中)

    虚拟数据框 id family lt c 1 1 2 2 3 3 people lt c male female male female male children dataset lt data frame id family peopl
  • 更改 ggplot 条形图填充颜色

    有了这个数据 df lt data frame value c 20 50 90 group c 1 2 3 我可以得到一个条形图 df gt ggplot aes x group y value fill value geom col c
  • 当按多列分组时,如何命名 dplyr 中的 group_split 列表

    我在 dplyr 中使用 group split 在分割了多个列后 我很难命名列表 当我们按一列分组时 我知道该怎么做here https stackoverflow com questions 57107721 how to name t
  • 从 data.frame 创建新列

    我有一个长格式的数据集 其中测量 时间 嵌套在 Networkpartners NP 中 而 Networkpartners NP 又嵌套在人员 ID 中 下面是它的示例 真实数据集有数千行 ID NP Time Outcome 1 11
  • 使用 gbuffer 在 R 中缓冲(地理)空间点

    我正在尝试缓冲数据集中半径为 100 公里的点 我正在使用该功能gBuffer从包装中rgeos 这是我到目前为止所拥有的 head sampledf postalcode lat lon city province 1 A0A0A0 47
  • 如何处理重叠的因子水平? (例如,生成表格和图表时)

    我面临一个数据集的问题重叠因素水平 我想按因素级别生成时间线 条形图和统计数据 但是 我希望因子水平是模棱两可的 这意味着属于多个级别的观察结果应该在图中出现多次 这是我的数据结构的示例 head lt c ID YEAR BRAZIL G
  • 为 RStudio Server 1.0.44 配置日志目录

    我在 CentOS 7 上运行 RStudio Server 1 0 44 根据文档 https support rstudio com hc en us articles 200554766 RStudio Server Applicat
  • 从 Cox PH 模型预测概率

    我正在尝试使用 cox 模型来预测时间 称为停止 3 后失败的概率 bladder1 lt bladder bladder enum lt 5 coxmodel coxph Surv stop event rx size number cl
  • left_join 表示列不存在,即使它存在

    我想用两个不同的变量 tp join 连接两个数据框 出现错误 表示无法在第二个数据帧中找到变量 但是当我运行函数 colnames 时 会显示列名称 为什么会这样呢 df new lt left join master settlemen
  • 如何从类外部更改公共 R6 类方法?

    我希望能够在我的 R6 类中重新定义公共方法 以便它根据该类保存的数据类型进行更改 如下所示 library R6 Simple lt R6Class Simple public list dt mtcars my print functi
  • 用于更改向量中元素顺序的闪亮小部件

    在很多网站上 您都有一个拖放界面来更改列表中元素的顺序 我正在寻找类似的东西闪亮 我希望用户能够拖放列表中的元素 通过更改顺序来更改优先级 现在我有一个滥用的解决方案selectizeInput 这是可行的 但当选择列表变得更大时 它很快就
  • R Shiny - 修复了 Shiny 仪表板中的侧边栏和主标题

    我有一个简化的闪亮仪表板 请参阅下面的代码 我想修复侧边栏和主标题 因此 在其他帖子的帮助下 我编写了一个 CSS 文件来解决该问题 sidebar color FFF position fixed width 220px white sp
  • 将函数应用于每个列组合

    我有一个数据框n列并希望对每个列应用一个函数组合列 这与如何cor 函数将数据帧作为输入并生成相关矩阵作为输出 例如 X lt data frame A rnorm 100 B rnorm 100 C rnorm 100 cor X 这将生

随机推荐

  • 如何在调用sqlcmd时更改端口

    我有这个命令 sqlcmd exe E i C joe db scripts joe db tasks Install sql 我需要添加特定的非标准端口 32001 我该怎么做 我在想一些像这样的标志 p或其他东西 但我不知道语法 根据这
  • 在select语句中显示表名

    我需要在 select 语句中显示表名 如何 确切的问题 我们在两个表中有公共列 我们正在使用以下方式显示记录 select column name from table name 1 union select column name fr
  • 如何使用 Google CardBoard Android SDK 和 Rajawali 制作一个简单的 VR 视频播放器

    我是这些领域的新人 我正在尝试改变一个program https github com ejeinc RajawaliCardboardExample现在在 github 中播放 Cardboard 视频 我使用 StreamingText
  • 为什么媒体查询的顺序在 CSS 中很重要?

    最近 我一直在设计响应速度更快的网站 并且经常使用 CSS 媒体查询 我注意到的一种模式是 定义媒体查询的顺序实际上很重要 我没有在每个浏览器中测试它 只是在 Chrome 上测试 这种行为有解释吗 有时 当您的网站无法正常工作并且您不确定
  • 数组中出现 NullPointerException

    我不断收到 NullPointerException 见下文 在 C 中一切正常 但在 android 中却崩溃了 arrDBNumbers 已满 代码应该运行并计算 1 2 3 等到 49 的数量 将 1 添加到 arrFreq i 1
  • Python - Flask:找不到 render_template() [重复]

    这个问题在这里已经有答案了 我是烧瓶新手 我有这个代码 你能给我一个建议吗 我做错了什么 谢谢 from flask import Flask from flask import request from flask import rend
  • Android:2个具有相同包的aar库

    Edit 基于此讨论的后续问题已发布在以下链接中 Android 如何管理同一应用程序使用的多个库中的公共代码库 https stackoverflow com questions 57572278 android how to manag
  • 我无法更改 static void Main(string[] args)

    我无法在控制台应用程序中更改 static void Main string args 谁能告诉我如何将其更改为其他内容 如果您的意思是无法将其更改为非静态的 或者无法更改其名称 那就对了 应用程序的入口点 must叫做Main must保
  • ASP.NET 部分回发期间打开时的 jQueryUI 日期选择器行为:年份变为 1899 或 1900

    我在 jQueryUI 日期选择器和 UpdatePanel 中遇到了一个非常有趣的错误 其中日期选择器选择的日期大约是 100 年后 jQuery 的版本为 1 6 2 jQueryUI 的版本为 1 8 14 这是粗略的布局
  • 了解事件循环

    我正在思考这个问题 这就是我想到的 我们看下面这段代码 console clear console log a setTimeout function console log b 1000 console log c setTimeout
  • 模式中的 Bootstrap 日期选择器不起作用

    我试图用谷歌搜索并搜索类似的问题 但到目前为止还没有找到任何东西 我有一个问题 我从 jquery 创建并打开模式并尝试访问日期选择器 但它不会激活日期选择器 JS id add click function myModal modal h
  • 在Java变量和方法名称中使用下划线[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Angular2 中进行嵌套的 Observable 调用

    我在进行嵌套的 Observable 调用时遇到了一些麻烦 我的意思是调用一个 http 服务来检索用户 然后从用户处获取 id 以进行另一个 http 调用 最后在屏幕上呈现结果 1 HTTP GET 1 获取用户 2 HTTP GET
  • 无论我做什么,都无法使用预签名 URL 将文件上传到 S3。 AWS 命令​​行有效。 CURL 和其他 = 403

    我的 AWS 凭证位于 aws credentials是正确的并且有效 证明 aws s3api put object bucket
  • 保存时将笔记本 (.ipynb) 导出为 .py 文件

    我目前正在使用 Jupyter IPython Notebook 我想将我的笔记本置于版本控制之下 这就是为什么当我保存并检查笔记本 ipynb 文件 时 我希望更改也能保存并同步到同一文件夹中相应的 python 脚本 py 文件 中 见
  • 将 pyodbc.rows 列表转换为 pandas Dataframe 需要很长时间

    有没有更快的方法将 pyodbc rows 对象转换为 pandas Dataframe 将超过 1000 万个 pyodbc rows 对象的列表转换为 pandas dataframe 大约需要 30 40 分钟 import pyod
  • 停止 CherryPy 中的请求处理并从工具返回 200 响应

    我的问题 我正在寻找一种方法来停止工具中的请求处理而不引发异常 换句话说 我想在请求到达指定的控制器之前停止请求并返回 2xx 状态代码 背景 我们希望我们的应用程序支持 CORS 以及预检请求 这个想法是编写一个工具来挂钩before h
  • FacebookSDK 呈现登录 UI 两次

    将 iOS 6 与 FacebookSDK 结合使用会将读取和发布权限的请求拆分为两个单独的调用 我不确定为什么这样做有任何好处 但它似乎需要在第一次时向用户展示 Facebook UI 两次 在我的应用程序中 在用户选择使用 Facebo
  • Silverlight 的拖放控件

    最近 我需要向 Silverlight 应用程序添加拖放功能 谁能推荐一个好的拖放控件 我创建了一个拖 放控制器 我认为效果非常好 我已经使用这种技术有一段时间了 我对此非常满意 http houseofbilz com archive 2
  • 匿名函数中的 rlang::sym

    我最近注意到rlang sym似乎不适用于匿名函数 我不明白为什么 这是一个例子 它非常笨拙和丑陋 但我认为它说明了这一点 require tidyverse data lt tibble x1 letters 1 3 x2 letters