Нужно ли объявлять операторы присваивания атрибутов в NAMESPACE? Как? - PullRequest
6 голосов
/ 14 апреля 2020

У меня есть пакет с функцией 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()<-"

1 Ответ

2 голосов
/ 15 апреля 2020

fn_fmls<- - это совершенно отдельная функция, пример так называемой замещающей функции , подробнее о которой вы можете узнать по ссылке. Суть в том, что он должен принимать форму function_name<- и всегда возвращает измененную версию своего первого аргумента.

В документации rlang мы можем видеть, что fn_fmls<- принимает два аргумента, fn и value. Функция используется для замены формальных аргументов 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.

...