属性赋值运算符是否需要在 NAMESPACE 中声明?如何?

Do attribute assignment operators need to be declared in NAMESPACE? How?

我有一个带有函数 foo 的包,它使用 rlang::fn_fmls()rlang::fn_fmls()<-:

#' @importFrom rlang fn_fmls missing_arg
foo <- function(x) {
  args <- rlang::fn_fmls(x)
  args <- c(args, bar = rlang::missing_arg())
  rlang::fn_fmls(x) <- args

  return(x)
}

使用 roxygen2,我显然需要用 @importFrom rlang ... 记录这个函数,以便在我的命名空间中声明这些函数。但是,包含 fn_flms 是否也处理 fn_fmls<- 的声明?还是也需要单独包含?如果是这样,如何? @importFrom rlang fn_fmls<-"fn_fmls()<-"?

fn_fmls<- 是一个完全独立的函数,是所谓的 replacement function 的一个示例,您可以在 link 中阅读更多相关信息。要点是它必须采用 function_name<- 形式,并且总是 returns 它的第一个参数的修改版本。

我们可以在 rlang 文档中看到 fn_fmls<- 有两个参数,fnvalue。该函数用于将 fn 的形式参数替换为 value。使用一个非常简单的例子,如果我们只导入 fn_fmls,我们得到:

#' @importFrom rlang fn_fmls
foo <- function(values) {
  fn <- function(a = 1, b = 2) A + B
  fn_fmls(fn) <- values
  fn()
}

foo(list(A = 10, B = 20))
#> Error in fn_fmls(fn) <- values : could not find function "fn_fmls<-"

相反,如果我们导入 fn_fmls<-,我们得到:

#' @importFrom rlang `fn_fmls<-`
foo <- function(values) {
  fn <- function(a = 1, b = 2) A + B
  fn_fmls(fn) <- values
  fn()
}

foo(list(A = 10, B = 20))
#> [1] 30

请注意,我们不必导入 fn_fmls。这是因为,类似的命名只是方便的约定,因为 fn_fmls 是一个函数来检索函数的形式参数,所以命名一个函数来替换函数的形式参数是合乎逻辑的 fn_fmls<-, 因为它会写成 fn_fmls(fn) <- value.