Частичные функции сохраняют свою подпись - PullRequest
3 голосов
/ 19 февраля 2020

Мы можем использовать purrr::partial для создания частичных функций:

f <- function(x, y) {
  print(x)
  print(y)
  return(invisible())
}

ff <- purrr::partial(f, y = 1)

ff(2)
#> [1] 2
#> [1] 1

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

Это часто может быть весьма полезным, но имеет неприятный побочный эффект, заключающийся в том, что частичная функция теряет свою сигнатуру, которая заменяется элипсисом:

ff
#> <partialised>
#> function (...) 
#> f(y = 1, ...)

Хотя это не имеет никакого отношения к программированию, приводит к ухудшению читаемости кода во время разработки, когда «intellisense» RStudio больше не может помочь нам запомнить имена и / или порядок аргументов. Так есть ли какие-то другие средства частичной обработки, которые сохраняют исходную подпись (за вычетом аргументов частичного удаления), как показано ниже?

ff
#> <partialised>
#> function (x) 
#> f(y = 1, x)

Теперь, очевидно, это можно сделать вручную, определив новую функцию ff который является просто оберткой вокруг f с желаемыми аргументами.

ff <- function(x) f(x, y = 1)

Но это означает, что любые модификации подписи f должны быть реплицированы в ff. Так есть ли «более чистый» способ частичного сохранения подписи?

1 Ответ

2 голосов
/ 19 февраля 2020

Один из вариантов - использовать rlang::fn_fmls() (или base::formals() эквивалент), чтобы явно задавать значения по умолчанию для аргументов функции:

# If desired, create a copy of the function first: ff <- f
rlang::fn_fmls(f) <- purrr::list_modify( rlang::fn_fmls(f), y=1 )

args(f)
# function (x, y = 1) 

f(2)
# [1] 2
# [1] 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...