首页 > 解决方案 > 多次调用函数而不重复(使用 %>%)

问题描述

假设我们有 3 个具有这个最小功能的函数:

func1 <- function (x) {
  x + 1
}

func2 <- function (x, plus = T) {
  if (plus == TRUE) {
    x + 2
  } else {
    x - 5 
  }
}

func3 <- function (x) {
  x + 3
}

我想使用管道 (%>%) 运算符将这个函数相互嵌套:

library(magrittr)

func1(0) %>% func2(plus = T) %>% func2(plus = F) %>% func3
# result: 1

这是它的等效版本:

func3(func2(func2(func1(0), plus = T), plus = F))
# result: 1

我尝试找到一种不需要复制 func2() 函数的方法(因为我必须多次运行它,而且我想动态地更改函数调用的数量和参数)。目前我不是应用函数或地图包的大专家,但我想至少其中一个可以完成这项工作。

这当然只是一个虚拟示例,我的真实代码要复杂得多,我只是尝试简化我的问题以找到解决方案。

我必须使用管道运算符,所以我只对也适用于管道的解决方案感兴趣。

标签: rpipeapplypurrrmagrittr

解决方案


编写一个函数,将初始值x和结果输入func2并循环遍历这些结果:

func2_iterate = function(x, outcomes){
  for (i in 1:length(outcomes)){
    x = func2(x, outcomes[i])
  }
  return(x)
}

然后运行(使用func1, func2func3如上):

func1(0) %>% func2_iterate(c(T, F)) %>% func3
#result: 1

我还想指出,在这种特殊情况下,输出func2_iterate只是它的输入,加上2乘以 in 的数量Toutcomes减去5乘以 in 的F数量outcomes。但我假设你实际上有一些功能可以做更复杂的事情。


推荐阅读