首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rlang::expr(`=`(!!rlang::ensym(x),!!rlang::as_name(Y)在devtools::check()中产生奇怪的注释

rlang::expr(`=`(!!rlang::ensym(x),!!rlang::as_name(Y)在devtools::check()中产生奇怪的注释
EN

Stack Overflow用户
提问于 2020-08-18 23:16:11
回答 2查看 89关注 0票数 1

我在一个函数中使用了以下代码,该函数是我正在编写的R包的一部分:

代码语言:javascript
复制
x = "a"
y = "b"

rlang::expr(`=`(!!rlang::ensym(x), !!rlang::as_name(y)))

它会自动为下面的函数创建参数,如下所示:

代码语言:javascript
复制
a = "b"

然后可以将其插入如下所示的函数:

代码语言:javascript
复制
foo(a = "b")

问题是,当我运行devtools::check()函数时,由于代码的这一部分,我得到了一条注释。

代码语言:javascript
复制
my_function : <anonymous>: no visible global function definition for '!<-'

我认为问题出在bang-bang (!!)与=函数一起使用,但我真的想不出如何解决这个问题。

如果有人知道该怎么做才能防止这种情况发生,那就太好了!非常感谢!

编辑:基于MrFlick答案,我现在使用以下内容:

代码语言:javascript
复制
x = c("a", "b")
y = c("y", "z")

args <- purrr::map2(.x = x,
            .y = y,
            .f = function(x, y){
            rlang::exprs(!!rlang::as_name(x) := !!y)
            })

rlang::expr(foo(!!!unlist(args)))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-19 00:16:35

CRAN检查并不喜欢非标准的求值,所以当它看到你调用被解释为<-函数的=函数时,它不喜欢这个函数。

当您尝试动态构建命名参数时,rlang包通过定义:=操作符来解决此问题。因此,您可以使用以下命令构建参数

代码语言:javascript
复制
args <- rlang::exprs(!!rlang::as_name(x) := !!y)

然后将它们注入到调用中,使用

代码语言:javascript
复制
rlang::expr(foo(!!!args))
# foo(a = "b")

这应该可以防止CRAN试图找到特殊的赋值运算符,这也是人们通常应该如何使用rlang来实现此目的。

票数 2
EN

Stack Overflow用户

发布于 2020-08-19 00:38:44

这是意料之中的。使用utils::globalVariables("!<-")将此音符静音。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63471666

复制
相关文章

相似问题

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