【问题标题】:rlang::expr(`=`(!!rlang::ensym(x), !!rlang::as_name(y))) causes weird note in devtools::check()rlang::expr(`=`(!!rlang::ensym(x), !!rlang::as_name(y))) 在 devtools::check() 中导致奇怪的注释
【发布时间】:2020-08-18 15:16:11
【问题描述】:

我在作为我正在编写的 R 包的一部分的函数中使用以下代码:

x = "a"
y = "b"

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

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

a = "b"

然后可以将其插入到这样的函数中:

foo(a = "b")

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

my_function : <anonymous>: no visible global function definition for '!<-'

我认为问题在于 bang-bang (!!) 和 = 函数,但我真的不知道如何解决这个问题。

如果有人知道如何防止出现此注释,那就太好了!非常感谢!

编辑:根据 MrFlick 的回答,我现在使用以下内容:

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)))

【问题讨论】:

  • 您是否将!! 来自rlang 放入您的命名空间?我通常在NULL 函数上添加@importFrom rlang !!,这样我就不必反复调用rlang::
  • 是的,我在我的命名空间中定义了@importFrom rlang as_name ensym expr !!,但我仍然收到注释。我通常用:: 来指代每个函数,以明确它是什么包。但是,是的,@importFrom 就足够了。

标签: r package devtools tidyeval


【解决方案1】:

CRAN 检查不太喜欢非标准评估,因此当它看到您调用 = 函数并将其解释为 &lt;- 函数时,它不喜欢它。

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

构建您的论点
args <- rlang::exprs(!!rlang::as_name(x) := !!y)

然后将它们注入到调用中

rlang::expr(foo(!!!args))
# foo(a = "b")

这应该会阻止 CRAN 尝试找到特殊赋值运算符,并且通常应该如何使用 rlang 来实现这一目的。

【讨论】:

  • 如果目标是在参数列表中取消引用,这是正确的答案。在赋值的 LHS 上通过 quasiquotation 和 unquote 以编程方式创建函数有时很有用。在这种情况下,可以使用globalVariables() 解决 NOTE。
【解决方案2】:

这是意料之中的。使用 utils::globalVariables("!&lt;-") 将此 NOTE 静音。

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 2019-12-11
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    相关资源
    最近更新 更多