我有一个带有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)
}
Run Code Online (Sandbox Code Playgroud)
使用 roxygen2,我显然需要用 an 来记录这个函数,@importFrom rlang ...以便在我的 NAMESPACE 中声明这些函数。但是,包含fn_flmsthere 是否也处理fn_fmls<-? 还是也需要单独包含?如果是这样,如何?@importFrom rlang fn_fmls<-? "fn_fmls()<-"?
fn_fmls<-是一个完全独立的函数,是所谓的替换函数的示例,您可以在链接中阅读更多信息。要点是它必须采用 形式function_name<-,并且始终返回其第一个参数的修改版本。
我们可以在rlang文档中看到它fn_fmls<-有两个参数,fn和value。该函数用于替换 的形式fn参数value。使用一个非常简单的例子,如果我们只 import 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<-"
Run Code Online (Sandbox Code Playgroud)
相反,如果我们 import 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
Run Code Online (Sandbox Code Playgroud)
请注意,我们不必导入fn_fmls. 这是因为,类似的命名只是为了方便起见,因为fn_fmls是一个检索函数形式参数的函数,因此命名一个函数来替换函数 的形式参数是合乎逻辑的fn_fmls<-,因为它将被写为fn_fmls(fn) <- value。