【问题标题】:Why do function argument names need to match list names with pmap?为什么函数参数名称需要与 pmap 匹配列表名称?
【发布时间】:2020-03-31 01:26:11
【问题描述】:

我试图理解为什么这段代码有效:

tmp <- list(this = list(1:5), 
            that = list(10*c(1:5)), 
            other = list(100*c(1:5))) 

tmp %>% pmap(function(this, that, other) paste(this, that, other))

...但以下代码会产生“未使用的参数”错误:

tmp %>% pmap(function(a, b, c) paste(a, b, c))

我遇到了this GitHub 帖子,但我仍然不清楚它如何应用......谢谢!

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    除非我误解了您的问题,否则第二个不起作用,因为 abc 不是附加在 pmap 调用环境中的列表元素。

    如果您将列表元素命名为 abc,它将起作用。

    tmp2 <- list(a = list(1:5), 
                b = list(10*c(1:5)), 
                c = list(100*c(1:5))) 
    
    tmp2 %>% pmap(function(a, b, c) paste(a, b, c))
    #[[1]]
    #[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"
    

    您的全局环境中是否有名为abc 的对象?我收到一条不同的错误消息。

    tmp %>% pmap(function(a, b, c) paste(a, b, c))
    #Error in .f(this = .l[[1L]][[1L]], that = .l[[2L]][[1L]], other = .l[[3L]][[1L]],  : 
    #  unused arguments (this = .l[[1]][[1]], that = .l[[2]][[1]], other = .l[[3]][[1]])
    
    packageVersion("purrr")
    #[1] ‘0.3.3’
    

    【讨论】:

      【解决方案2】:

      我们可以在没有任何匿名函数的情况下做到这一点

      library(purrr)
      library(dplyr)
      tmp %>%
           pmap(paste)
      #[[1]]
      #[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"
      

      另外,tidyverse,匿名语法可以是

      tmp %>%
         pmap(~ paste(..1, ..2, ..3))
      #[[1]]
      #[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"
      

      【讨论】:

        【解决方案3】:

        如果您有示例中所示的命名列表,则需要在匿名函数中使用它们各自的名称来引用它们。因此,这适用于命名列表

        library(purrr)
        tmp %>% pmap(function(this, that, other) paste(this, that, other))
        

        但事实并非如此。

        tmp %>% pmap(function(a, b, c) paste(a, b, c))
        

        如果您删除列表的名称,那么您可以在参数中使用任何变量。

        unname(tmp) %>% pmap(function(a, b, c) paste(a, b, c))
        
        #[[1]]
        #[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"
        

        【讨论】:

        • 谢谢!我一直在努力想知道这与您可能在 lapply 设置中传递的函数有何不同——“匿名函数”可能是我需要查找的关键字。
        猜你喜欢
        • 2011-12-26
        • 2018-07-05
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2018-03-08
        • 2011-07-11
        • 2019-03-12
        相关资源
        最近更新 更多