代码之家  ›  专栏  ›  技术社区  ›  Lazarus Thurston

有没有一种方法可以循环使用purr::map2或purr::walk2中较短列表的元素?

  •  0
  • Lazarus Thurston  · 技术社区  · 6 年前

    purrr 似乎不支持向量元素的回收,以防其中一个元素不足(使用时 purrr::map2 purrr::walk2 )。与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)长度不同

    我非常理解为什么不允许这样做——因为这样做会使捕获bug非常困难。但是,我有没有办法强迫这件事发生呢?也许用一些卑鄙的r技巧来对付purr?

    2 回复  |  直到 6 年前
        1
  •  1
  •   A. Stam    6 年前

    您可以将这两个列表放在一个数据帧中,并让该命令重复您的向量:

    input <- data.frame(a = 1:3, b = 4:9)
    purrr::map2(input$a, input$b, sum)
    
        2
  •  0
  •   moodymudskipper    6 年前

    这是按设计的 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