R是否等效于Python的'*'?

时间:2019-10-16 14:58:22

标签: r

在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)

2 个答案:

答案 0 :(得分:9)

基本R

进行呼叫在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包

调用 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)