invoke_map很难找到参数

时间:2019-06-13 10:20:38

标签: r tidyverse purrr

我正在研究tidyverse包装。因此,我对如何以整洁的方式完成以下任务感兴趣。使用*thisDirectiveIMadeForJustOneComponentWhichMakesItRequireBeingPlacedInItsOwnModule函数可以轻松解决该问题。

请考虑以下数据

*apply

我使用tb <- lapply(matrix(c("a", "b", "c")), function(x) rep(x, 3)) %>% unlist %>% c(rep(c(1, 2, 3), 6)) %>% matrix(ncol = 3) %>% as_tibble(.name_repair = ~ c("tag", "x1", "x2")) %>% type.convert() # A tibble: 9 x 3 tag x1 x2 <fct> <int> <int> 1 a 1 1 2 a 2 2 3 a 3 3 4 b 1 1 5 b 2 2 6 b 3 3 7 c 1 1 8 c 2 2 9 c 3 3 函数对它们进行分组,对于每个组,我希望应用与函数nest()列表不同的函数

f_1, f_2, f_3

我尝试使用invoke_map来应用功能

f_1 <- function(x)
  x[,1] + x[,2]
f_2 <- function(x)
  x[,1] - x[,2]
f_3 <- function(x)
  x[,1] * x[,2]

tb_func_attached <- 
    tb %>% group_by(tag) %>% nest() %>% mutate(func = c(f_0, f_1, f_2))

    # A tibble: 3 x 3
  tag   data             func  
  <fct> <list>           <list>
1 a     <tibble [3 x 2]> <fn>  
2 b     <tibble [3 x 2]> <fn>  
3 c     <tibble [3 x 2]> <fn> 

但是在运行以下代码时,我得到了错误tb_func_attached %>% {invoke_map(.$func, .$data)} invoke_map(tb_func_attached$func, tb_func_attached$data)

Error in (function (x)  : unused arguments (x1 = 1:3, x2 = 1:3)

但是> tb_func_attached$func[[1]](tb_func_attached$data[[1]]) x1 1 2 2 4 3 6 > tb_func_attached$func[[2]](tb_func_attached$data[[2]]) x1 1 0 2 0 3 0 > tb_func_attached$func[[3]](tb_func_attached$data[[3]]) x1 1 1 2 4 3 9 仍然不起作用。

因此问题是,给定嵌套数据invoke_map,如何将功能tb_func_attached“逐行”应用于tb_func_attached$func

还有一个疑问,tb_func_attached$data退休的原因是什么?它非常适合“恕我直言”的概念。

更新:

以前的版本处理单列数据(invoke_map仅具有标签和tb列)和@A。苏里曼的评论提供了解决方案。

但是,当嵌套小标题中的数据列具有矩阵结构时,代码将再次运行。

1 个答案:

答案 0 :(得分:0)

使用map2首先在函数列表上进行迭代,然后在数据列上进行迭代。像这样:

tb_func_attached %>% 
  mutate(output = map2(func, data, ~ .x(.y))) %>% 
  unnest(data, output)

输出看起来是这样的:

# A tibble: 9 x 4
  tag      x1    x2   x11
  <fct> <int> <int> <int>
1 a         1     1     2
2 a         2     2     4
3 a         3     3     6
4 b         1     1     0
5 b         2     2     0
6 b         3     3     0
7 c         1     1     1
8 c         2     2     4
9 c         3     3     9