首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在rlang的lazyeval调用中使用二进制运算符

在rlang的lazyeval调用中使用二进制运算符
EN

Stack Overflow用户
提问于 2018-03-06 15:27:00
回答 1查看 92关注 0票数 1

假设我希望使用dplyr和标准评估将1添加到列的每个值中。

我能做到:

代码语言:javascript
复制
library(dplyr)
data <- head(iris)
var <- "Sepal.Length"
mutate(data, !!rlang::sym(var) := !!quo(`+`(!!rlang::sym(var), 1)))

但是,如果我想使用+作为二进制运算符而不是函数呢?我不知道如何用一个符号来写+。在我的大多数尝试中,我尝试在二进制运算符+中使用非数字参数(例如符号)时出错。

对于不推荐的mutate_,您可以使用lazyeval::interp,这使您可以轻松地完成任务:

代码语言:javascript
复制
mutate_(data, .dots = setNames(list(lazyeval::interp(~var + 1, var = as.symbol(var))), var))

任何帮助都将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-06 16:07:29

你可以用

代码语言:javascript
复制
mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)

注意“砰”部分周围的括号。这是必要的,因为您可能使用的是较旧版本的rlang。在旧版本(<0.2)中,!!的优先级非常低,因此在展开之前就会添加。从rlang0.2开始,!!被赋予了不同的操作符优先级,并以您可能期望的方式工作。

当然,如果要将相同的转换应用于一组列,则可能需要使用mutate_atmutate_allmutate_if版本,这也允许转换具有特定的公式语法。

代码语言:javascript
复制
mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49134387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档