【问题标题】:R extract name of object within purrr::map()R 在 purrr::map() 中提取对象的名称
【发布时间】:2020-08-21 23:45:27
【问题描述】:

我正在尝试提取在 purrr::map() 中映射的对象的名称。这是问题的简化示例。

library(tidyverse)

input <- list(df1 = mtcars, df2 = iris)

map(input, ~ deparse(substitute(.x)))

我的 SO 搜索让我使用了“deparse(subsitute()”技巧。但在这个例子中,它返回了

$df1
[1] "..1"

$df2
[1] "..1"

而不是我想要的,那是

df1
[1] "df1"

$df2
[1] "df2"

换句话说,我需要能够在更精细的 lambda 函数中处理列表中对象的名称。

提前感谢您的帮助。

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    您可以使用map2 并传递数据和名称。

    purrr::map2(input, names(input), ~.y)
    
    #$df1
    #[1] "df1"
    
    #$df2
    #[1] "df2"
    

    这里.x 有数据,而.yinput 的名称。

    同样可以在基础 R 中使用 Map 来实现:

    Map(function(x, y) y, input, names(input))
    

    其中x 是数据,y 是名称。

    【讨论】:

      【解决方案2】:

      我们可以使用imap(它调用map2 来传递名称索引)代替map,并使用.y 提取list 名称和.x 的值。这里imap 正在调用map2

      library(purrr)
      imap(input, ~ .y)
      #$df1
      #[1] "df1"
      
      #$df2
      #[1] "df2"
      

      或者代替.x.y,也可以使用..1..2

      imap(input, ~ ..2)
      

      基本上imap 正在调用map2

       imap
        function (.x, .f, ...) 
       {
      .f <- as_mapper(.f, ...)
      map2(.x, vec_index(.x), .f, ...)
        }
      

      如果我们想使用map,选项是循环nameslist的序列

      map(names(input), ~ .x)
      

      对于值的子集,使用[[

      map(names(input), ~ input[[.x]])
      

      对于map.x 只是数据的值,list 的名称不会传入其中


      如果我们想使用base R,那么一个选项是Map

      Map(function(u, v) v, input, names(input))
      

      或使用lapply

      lapply(names(input), function(nm) nm)
      

      【讨论】:

      • 一如既往地感谢您提供清晰而有帮助的答案!
      猜你喜欢
      • 1970-01-01
      • 2018-10-02
      • 2019-05-17
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2018-11-16
      相关资源
      最近更新 更多