База R
do.call В R это do.call
. Первый аргумент - это функция или символьная строка, дающая имя функции, а второй аргумент - список, компоненты которого будут переданы в качестве отдельных аргументов функции. Пакеты не используются.
val <- c(1, 2, 3)
f <- function(a, b, c) a+b+c
do.call("f", as.list(val))
## [1] 6
Reduce Другой подход заключается в карри f
создании новой функции с фиксированным первым аргументом, неоднократно делая это, используя Reduce
для обработки каждого последующегоаргумент. Пакеты не используются.
Reduce(function(f, x, ...) function(...) f(x, ...), val, init = f)()
## [1] 6
пакет purrr
invoke Пакет purrr имеет invoke
, который в основном просто вызывает do.call
, но он также преобразует второйаргумент для списка, если он еще не является списком:
library(purrr)
invoke(f, val)
## [1] 6
lift purrr также имеет lift
, который преобразует функцию, которая принимает отдельные аргументы, в новую функцию, которая принимаетсписок или вектор. Он также переносит do.call
lift(f)(val)
## [1] 6
частичный purrr также имеет partial
, который будет каррировать функцию, создавая новую функцию с фиксированным первым аргументом, принимая только оставшиеся аргументы, используя reduce
(также в purrr) для многократного вызова такого каррирования:
reduce(val, partial, .init = f)()
## [1] 6
функциональный пакет
Curry Curry
из функционального пакета также может быть использован для исправленияпервый аргумент. При использовании вместе с Reduce
от базы R для многократного применения Curry
это дает тот же результат. Обратите внимание, что Curry
использует do.call
для внутреннего использования.
library(functional)
Reduce(Curry, init = f, val)()
## [1] 6