将多个函数传递给purrr:map

将多个函数传递给purrr:map,r,tidyverse,purrr,R,Tidyverse,Purrr,我想一次将多个函数传递给一个purrr::map调用,其中函数需要一些参数。作为伪代码: funs <- c(median, mean) mtcars %>% purrr::map(funs, na.rm = TRUE) funs% purrr::map(funs,na.rm=TRUE) 这段代码不运行,但旨在显示我要查找的内容:将多个函数传递给map,并附带一些参数 我查看了compose,但是该函数做了一些不同的事情。您希望使用map()将多个函数应用于数据帧,但是

我想一次将多个函数传递给一个purrr::map调用,其中函数需要一些参数。作为伪代码:

funs <- c(median, mean)

mtcars %>% 
  purrr::map(funs, na.rm = TRUE) 
funs%
purrr::map(funs,na.rm=TRUE)
这段代码不运行,但旨在显示我要查找的内容:将多个函数传递给
map
,并附带一些参数


我查看了
compose
,但是该函数做了一些不同的事情。

您希望使用map()将多个函数应用于数据帧,但是(显然)没有map()变体可以完全做到这一点,只有它的一部分。对于多函数部分,我们有invoke_map(),对于数据帧上的多参数部分,我们有pmap()

invoke\u map()
允许同时使用多个函数。例如,如果我们想要为均匀和正态分布生成5个随机变量,代码为:

func <- list(runif, rnorm) 
invoke_map(func, n = 5)
为了解决您的问题,我们必须以以下方式将这两种功能结合起来:

fun <- function(f) pmap(list(x = mtcars, na.rm = TRUE), f)
param <- list(list(mean), list(median))

invoke_map(.f = fun, .x = param)

fun这是我的婴儿步骤解决方案(取决于你所说的“立刻”是什么意思):

invoke()
及其映射变体已退出,取而代之的是
rlang::exec()
。从文件中:

这些函数已退出,以支持exec()。他们不再是 正在积极开发中,但我们将在包中保留它们 无限期

invoke()因使用更简单的exec()函数而失效 从兰格再出口。exec()计算从其 输入和支持整洁的点

invoke_map()已停用而不进行替换,因为它比 比使用map()和map2()的相应代码更复杂 行政长官()

因此,现在的等效方法是:

library(dplyr)
library(purrr)

funs <- c(mean = mean, median = median)
args <- list(na.rm = TRUE, trim = .1) # trim argument non-matching and ignored for median

mtcars %>%
  map_df(~ funs %>%
           map(exec, .x, !!!args), .id = "var")

# A tibble: 11 x 3
   var      mean median
   <chr>   <dbl>  <dbl>
 1 mpg    19.7    19.2 
 2 cyl     6.23    6   
 3 disp  223.    196.  
 4 hp    141.    123   
 5 drat    3.58    3.70
 6 wt      3.15    3.32
 7 qsec   17.8    17.7 
 8 vs      0.423   0   
 9 am      0.385   0   
10 gear    3.62    4   
11 carb    2.65    2  
库(dplyr)
图书馆(purrr)
funs%
映射(exec,.x,!!!args),.id=“var”)
#一个tibble:11x3
var均值中值
1 mpg 19.7 19.2
2气缸6.23 6
3 disp 223。196
4 hp 141。123
5德拉特3.58 3.70
6 wt 3.15 3.32
7 qsec 17.8 17.7
8比0.4230
上午9时0.3850分
10档3.62 4
11碳水化合物2.65 2

谢谢,这很有帮助。不过,我希望解决办法更直接一些。代码不容易阅读。也许这段代码更清晰:
mtcars%>%purrr::map\u dfr(马赛克::favstats)
这是一种有效的方法,尽管我希望能有更直接的方法。谢谢
mtcars %>% 
  map_dbl(~{mean(.x, na.rm = TRUE)}) %>% 
  enframe() %>%
  rename(mean = value) %>%
  as_tibble %>%
  left_join(mtcars %>% 
              map_dbl(~{median(.x, na.rm = TRUE)}) %>% 
              enframe() %>% 
              as_tibble %>%
              rename(median = value))
library(dplyr)
library(purrr)

funs <- c(mean = mean, median = median)
args <- list(na.rm = TRUE, trim = .1) # trim argument non-matching and ignored for median

mtcars %>%
  map_df(~ funs %>%
           map(exec, .x, !!!args), .id = "var")

# A tibble: 11 x 3
   var      mean median
   <chr>   <dbl>  <dbl>
 1 mpg    19.7    19.2 
 2 cyl     6.23    6   
 3 disp  223.    196.  
 4 hp    141.    123   
 5 drat    3.58    3.70
 6 wt      3.15    3.32
 7 qsec   17.8    17.7 
 8 vs      0.423   0   
 9 am      0.385   0   
10 gear    3.62    4   
11 carb    2.65    2