在python中,您可以执行以下操作:
val = [1, 2, 3]
def f(a, b, c):
return(a+b+c)
f(*val)
>>>6
Run Code Online (Sandbox Code Playgroud)
但是,是否有一个R等效于将列表/向量传递给函数并将其解压缩为函数的参数?
val <- c(1, 2, 3)
f <- function(a,
b,
c) {
a+b+c
}
#f(*val)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
减少另一种方法是f使用固定的第一个参数来咖喱创建一个新函数,反复使用此方法Reduce来处理每个连续的参数。不使用任何软件包。
Reduce(function(f, x, ...) function(...) f(x, ...), val, init = f)()
## [1] 6
Run Code Online (Sandbox Code Playgroud)
invoke purrr软件包invoke基本上具有调用功能,do.call但是如果第二个参数还不是列表,它将把第二个参数转换为列表:
library(purrr)
invoke(f, val)
## [1] 6
Run Code Online (Sandbox Code Playgroud)
lift purrr还具有lift将带单个参数的函数转换为带列表或向量的新函数的功能。它也包裹do.call
lift(f)(val)
## [1] 6
Run Code Online (Sandbox Code Playgroud)
部分 purrr也具有partial该函数,该函数将咖喱创建一个新函数的函数,其中第一个参数固定为仅保留其余参数,因此使用reduce(也在purrr中)重复调用这种计算:
reduce(val, partial, .init = f)()
## [1] 6
Run Code Online (Sandbox Code Playgroud)
Curry功能包中的Curry也可以用来修复第一个参数。与Reduce基数R 一起使用以重复应用Curry时,其结果相同。注意内部Curry使用do.call。
library(functional)
Reduce(Curry, init = f, val)()
## [1] 6
Run Code Online (Sandbox Code Playgroud)