如何解决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
,则选项是遍历names
或list
的序列
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
有数据,而.y
有input
的名字。
使用基数R中的Map
可以实现相同的目的:
Map(function(x,y) y,names(input))
其中x
是数据,y
是名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。