繁体   English   中英

将多个函数传递给 purrr:map

[英]Pass multiple functions to purrr:map

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

funs <- c(median, mean)

mtcars %>% 
  purrr::map(funs, na.rm = TRUE) 

此代码不能运行,而是意在展示我在寻找:在经过了多项功能, map以及一些参数。

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

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

invoke_map()允许一次使用多个函数。 例如,如果我们要为均匀分布和正态分布生成 5 个随机变量,代码为:

func <- list(runif, rnorm) 
invoke_map(func, n = 5)

pmap()就像 map,但它允许将多个参数传递给单个函数。 例如,如果我们想从均值 = 0 和 sd = 1 的正态分布生成 10 个随机变量,还要从均值 = 100 和 sd = 20 的正态分布生成 100 个随机变量,代码如下所示:

args <- list(mean = c(0, 100), sd = c(1, 20), n = c(10, 100))
pmap(args, rnorm)

要解决您的问题,我们必须按以下方式组合这两个功能:

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

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

这是如何运作的?

  1. 在 invoke_map() 级别, fun将参数param用作我们要应用于mtcars的函数。

  2. 接下来,在fun层面,存储在param中的这些函数由pmap()一次一个应用到mtcars每一列。

注意:要使解决方案真正有意义,请记住 invoke_map() 和 pmap() 所采用的参数。

有关invoke_map()pmap() 如何工作的更多信息。

invoke()及其地图变体已被rlang::exec() 从文档:

这些函数被 exec() 所取代。 它们不再处于积极开发状态,但我们将无限期地将它们保留在包中。

invoke() 已退休,取而代之的是从 rlang 重新导出的更简单的 exec() 函数。 exec() 评估从其输入构建的函数调用并支持整洁的点

invoke_map() 不再替换,因为它比使用 map()、map2() 和 exec() 的相应代码更难理解

所以现在等效的方法是:

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  

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

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM