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"
也可以将函数作为列表传递,但它们的参数也需要放入单独的列表中,这对于交互使用来说似乎需要做更多的工作。
我在 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"
也可以将函数作为列表传递,但它们的参数也需要放入单独的列表中,这对于交互使用来说似乎需要做更多的工作。