是否需要在NAMESPACE中声明属性分配运算符?怎么样?

问题描述 投票:6回答:1

我有一个带有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 ...记录此函数,以便在NAMESPACE中声明这些函数。但是,包含fn_flms的内容也可以处理fn_fmls<-的声明吗?还是也需要单独包含?如果是这样,怎么办? @importFrom rlang fn_fmls<-"fn_fmls()<-"

r roxygen2
1个回答
0
投票

fn_fmls<-是一个完全独立的函数,这是所谓的replacement function的示例,您可以在此处了解更多信息。要点是它必须采用function_name<-的形式,并且始终返回其第一个参数的修改版本。

我们可以在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

© www.soinside.com 2019 - 2024. All rights reserved.