有什么办法可以回收purrr :: map2或purrr :: walk2中较短列表的元素?

时间:2019-01-18 15:16:51

标签: r purrr

purrr似乎不支持向量元素的回收,以防这两个元素之一缺少元素(使用purrr::map2purrr::walk2时)。与baseR不同,在baseR中,如果较大的向量不是较短的向量的倍数,我们只会收到警告。

考虑这个玩具示例:

这有效:

map2(1:3,4:6,sum)
#

#[[1]]
#[1] 5

#[[2]]
#[1] 7

#[[3]]
#[1] 9

这不起作用:

map2(1:3,4:9,sum)
  

错误:.x(3)和.y(6)的长度不同

我非常清楚为什么不允许这样做-因为这样做会使捕获错误非常困难。但是有什么办法可以使这种情况发生吗?也许在purrr中使用一些基本的R技巧?

2 个答案:

答案 0 :(得分:1)

您可以将两个列表都放在一个数据框中,然后让该命令重复您的向量:

input <- data.frame(a = 1:3, b = 4:9)
purrr::map2(input$a, input$b, sum)

答案 1 :(得分:0)

它是通过 purrr 设计的,但是您可以使用Map

Map(sum,1:3,4:9)
# [[1]]
# [1] 5
# 
# [[2]]
# [1] 7
# 
# [[3]]
# [1] 9
# 
# [[4]]
# [1] 8
# 
# [[5]]
# [1] 10
# 
# [[6]]
# [1] 12

如果需要的话,这就是我将如何循环使用的方法:

x <- 1:3
y <- 4:9
l <- max(length(y), length(x))
map2(rep(x,len = l), rep(y,len = l),sum)
# [[1]]
# [1] 5
# 
# [[2]]
# [1] 7
# 
# [[3]]
# [1] 9
# 
# [[4]]
# [1] 8
# 
# [[5]]
# [1] 10
# 
# [[6]]
# [1] 12