Как обновить сигнатуру функции после модификации с помощью rlang :: fn_fmls? - PullRequest
1 голос
/ 08 апреля 2020

rlang::fn_fmls<- позволяет изменять сигнатуры функций:

f <- function(a, b, c) print(paste(a, c))
f_args <- rlang::fn_fmls(f)
f_args["b"] <- NULL
rlang::fn_fmls(f) <- f_args
f(1, 2)
#> [1] "1 2"

Создано в 2020-04-07 пакетом Представить (v0.3.0)

Очевидно, мы удалили b из подписи функции. Однако, если мы напечатаем саму функцию:

f
#> function(a, b, c) print(paste(a, c))

b все равно появится в ее подписи. Использование args(f) (которое печатает только подпись) действительно работает, и b опущено.

Что нужно сделать, чтобы функция (с телом) печаталась правильно, с опущенным b?

1 Ответ

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

Кажется, проблема в том, что print.function() имеет useSource = TRUE, что заставляет использовать оригинальную сигнатуру и тело функции.

Решение, которое я нашел, состоит в том, чтобы изменить класс функции и создать пользовательский функция печати. ​​

f <- function(a, b, c) {
  b <- 1
  print(paste(a, c))
}
f_args <- rlang::fn_fmls(f)
f_args["b"] <- NULL
rlang::fn_fmls(f) <- f_args
class(f) <- c("myfunction", "function")

print.myfunction <- function(f) {
  class(f) <- NULL
  print(f, useSource = FALSE)
}

f
#> function (a, c) 
#> {
#>     b <- 1
#>     print(paste(a, c))
#> }

Создано в 2020-04-07 пакетом представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...