R 在 purrr::map() 中提取对象名称

DSH*_*DSH 5 r purrr

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

library(tidyverse)

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

map(input, ~ deparse(substitute(.x)))
Run Code Online (Sandbox Code Playgroud)

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

$df1
[1] "..1"

$df2
[1] "..1"
Run Code Online (Sandbox Code Playgroud)

而不是我想要的,即

df1
[1] "df1"

$df2
[1] "df2"
Run Code Online (Sandbox Code Playgroud)

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

预先感谢您的任何帮助。

akr*_*run 4

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

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

#$df2
#[1] "df2"
Run Code Online (Sandbox Code Playgroud)

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

imap(input, ~ ..2)
Run Code Online (Sandbox Code Playgroud)

基本上imap就是打电话map2

 imap
  function (.x, .f, ...) 
 {
.f <- as_mapper(.f, ...)
map2(.x, vec_index(.x), .f, ...)
  }
Run Code Online (Sandbox Code Playgroud)

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

map(names(input), ~ .x)
Run Code Online (Sandbox Code Playgroud)

为了对值进行子集化,请使用[[

map(names(input), ~ input[[.x]])
Run Code Online (Sandbox Code Playgroud)

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


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

Map(function(u, v) v, input, names(input))
Run Code Online (Sandbox Code Playgroud)

或使用lapply

lapply(names(input), function(nm) nm)
Run Code Online (Sandbox Code Playgroud)