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

安娜·尼维森(Anna Nevison)

在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)
G.格洛腾迪克

基数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

减少另一种方法是f使用固定的第一个参数来咖喱创建一个新函数,反复使用此方法Reduce来处理每个连续的参数。不使用任何软件包。

Reduce(function(f, x, ...) function(...) f(x, ...), val, init = f)()
## [1] 6

rr包

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章