R提取purrr :: map中对象的名称

问题描述

我正在尝试提取在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函数中处理列表中对象的名称

在此先感谢您的帮助。

解决方法

我们可以使用imap(调用map2以传递名称索引)代替map,并用list和值提取.y名称与.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),...)
  }

如果我们要使用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)
,

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

purrr::map2(input,names(input),~.y)

#$df1
#[1] "df1"

#$df2
#[1] "df2"

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

使用基数R中的Map可以实现相同的目的:

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

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