在python中,您可以执行以下操作:
val = [1, 2, 3]
def f(a, b, c):
return(a+b+c)
f(*val)
>>>6
但是,是否有一个R等效于将列表/向量传递给函数并将其解压缩为函数的参数?
val <- c(1, 2, 3)
f <- function(a,
b,
c) {
a+b+c
}
#f(*val)
答案 0 :(得分:9)
进行呼叫在R中为do.call
。第一个参数是函数或给出函数名称的字符串,第二个参数是一个列表,其组件将作为各个参数传递给函数。不使用任何软件包。
val <- c(1, 2, 3)
f <- function(a, b, c) a+b+c
do.call("f", as.list(val))
## [1] 6
减少另一种方法是咖喱f
创建一个固定有第一个参数的新函数,反复使用Reduce
来处理每个连续的参数。不使用任何软件包。
Reduce(function(f, x, ...) function(...) f(x, ...), val, init = f)()
## [1] 6
调用 purrr程序包具有invoke
,它基本上只是调用do.call
,但是如果第二个参数还不是列表,它也会将其转换为列表:>
library(purrr)
invoke(f, val)
## [1] 6
lift purrr还具有lift
,它将把带有单个参数的函数转换为带有列表或向量的新函数。它还包装do.call
lift(f)(val)
## [1] 6
partial purrr还具有partial
,它将咖喱函数创建一个新函数,其中第一个参数固定,仅保留其余参数,因此使用reduce
(在purrr中)反复调用这种欺骗:
reduce(val, partial, .init = f)()
## [1] 6
Curry Curry
也可用于修复第一个参数。与基数R中的Reduce
一起重复使用Curry
时,它得到的结果相同。请注意,Curry
在内部使用do.call
。
library(functional)
Reduce(Curry, init = f, val)()
## [1] 6
答案 1 :(得分:2)
另一种选择是使用lift()
包中的purrr
Python wiki。您对f
的定义采用多个参数,用R术语称为“点”。您可以更改其签名以接受矢量:
f2 <- purrr::lift_dv(f)
f2(val)
## [1] 6
# Or as a one-liner
purrr::lift_dv(f)(val)