magrittr::freduce 是否有可以接受其他参数的替代方案?

Are there alternatives for magrittr::freduce that can accept additional parameters?

我在 Magrittr 包中发现的一个有用的函数是 freduce: freduce(value, function_list) 其中值按顺序从每个函数传递到下一个函数。问题是我的一些函数采用其他参数(在我的例子中,一个参数对于每个函数都是相同的)。有谁知道执行 magrittr::freduce 的类似功能。我将尝试使用 Purrr 函数为自己实现它,或者如果失败则只是循环或递归。我很好奇是否有人对这个想要在 freduce.

中使用附加参数的问题有经验或简单的解决方案

我不确定是否有任何替代方案,但 magrittr::freduce() 的源代码非常简单,请参阅 GitHub. It is using base R's Recall()。所以你可以像这样使用它来创建你自己的函数(例如,使用附加参数 na.rm):

freduce2 <- function(value, function_list, na.rm = TRUE)
{
  if (length(function_list) == 1L)
    function_list[[1L]](value, na.rm = na.rm)
  else 
    Recall(function_list[[1L]](value, na.rm = na.rm), function_list[-1L], na.rm = na.rm)
}

freduce2(c(1, 3, NA), list(mean, median), na.rm = TRUE)
#> [1] 2

reprex package (v0.3.0)

于 2020 年 7 月 17 日创建

我不确定这是否是您要查找的内容,但您可以轻松编写一个接受参数的函数,就好像您正在传递它们一样:

freduce2 <- function(data, ...)
{
  calls <- as.list(match.call())[-1][-1]
  
  for(i in seq_along(calls))
  {
     data <- eval(as.call(list(bquote(`%>%`), data, calls[[i]])), envir = parent.frame())
  }
  
  return(data)
}

它是这样工作的:

freduce2("hello", toupper, nchar, sum)
#> [1] 5

freduce2("hello", paste("world"), toupper)
#> [1] "HELLO WORLD"

freduce2("hello", paste("world"), toupper, rep(3), strsplit(""))
#> [[1]]
#>  [1] "H" "E" "L" "L" "O" " " "W" "O" "R" "L" "D"
#> 
#> [[2]]
#>  [1] "H" "E" "L" "L" "O" " " "W" "O" "R" "L" "D"
#> 
#> [[3]]
#>  [1] "H" "E" "L" "L" "O" " " "W" "O" "R" "L" "D"

也可以将函数作为列表传递,但它们的参数也需要放入单独的列表中,这对于交互使用来说似乎需要做更多的工作。