如何使用管道和purrr获取列表名和切片名

如何使用管道和purrr获取列表名和切片名,r,ggplot2,pipe,purrr,R,Ggplot2,Pipe,Purrr,我想知道在使用purrr的管道操作时,如何将列表名或组名作为标志。例如:我想对传递给ggsave函数的每个列表名使用dynameic参数 require(purrr) require(ggplot2) lst=list(a1=data.frame(x=1:10,y=2:11),a2=data.frame(x=1:10,y=-1*2:11)) df=rbind(transform(lst[[1]],id="a1"),transform(lst[[2]],id="a2")) lst %>% m

我想知道在使用purrr的管道操作时,如何将列表名或组名作为标志。例如:我想对传递给ggsave函数的每个列表名使用dynameic参数

require(purrr)
require(ggplot2)
lst=list(a1=data.frame(x=1:10,y=2:11),a2=data.frame(x=1:10,y=-1*2:11))
df=rbind(transform(lst[[1]],id="a1"),transform(lst[[2]],id="a2"))
lst %>% map(~ggsave(plot=qplot(data=.,x="x",y="y",geom="line"),file=paste(listname(.),".png")))
df %>% slice_rows("id") %>%
  by_slice(~ggsave(plot=qplot(data=.,x="x",y="y",geom="line"),file=paste("slicename(.)",".png")))

slicename(.)应该类似于unique([[“id”]]),但在使用slice_行时它不起作用

listname
slicename
不是
purr
中的函数,
names
purr
函数一起使用时,似乎不返回列表元素名称。另外,您可能希望使用
walk
函数族,而不是
map
by_slice
,因为调用函数是为了获得副作用,而不是为了返回的对象

因此,作为一种变通方法,您可以尝试

   lst=list(a1=data.frame(x=1:10,y=2:11),a2=data.frame(x=1:10,y=-1*2:11))

   list(lst, names(lst)) %>% 
        pwalk( ~ ggsave(plot=qplot(data=.x,x=x,y=y,geom="line"),filename=paste(.y,".png")) )
已添加

如果从数据帧开始,可以使用

df %>% split(.$id) %>% 
       list( names(.)) %>% 
       pwalk( ~ ggsave(plot=qplot(data=.x, x=x, y=y, geom="line"), filename=paste(.y,".png")))

值得一提的是,使用
purrr::walk2
可以避免创建包含
lst
names(lst)
元素的新列表:

lst=list(a1=data.frame(x=1:10,y=2:11),a2=data.frame(x=1:10,y=-1*2:11))

purrr::walk2(
  lst,
  names(lst),
  ~ ggsave(plot=qplot(data=.x,x=x,y=y,geom="line"),filename=paste(.y,".png"))
)
2017年8月30日更新:新的“索引”映射函数系列已在
purr
0.2.3中推出,它为
walk2(lst,names(lst))提供了一个简写形式


谢谢这是分组数据帧的最佳方式吗:
lst=list(a1=data.frame(x=1:10,y=2:11),a2=data.frame(x=1:10,y=-1*2:11))df=rbind(transform(lst[[1]],id=“a1”),transform(lst[[2]],id=“a2”)df%>%split([[id]])%>%list(,as.character(唯一的(df[[id]]))%>%pwalk(~ggsave=qplot(data=qplot=qplot,id=[x]]),id=geomy=.png),%pwy=[x]粘贴,.png=])))
如果unique(df[[“id”]])是一个因子而不是一个字符类,则结果不同(1.png,2.png),可能这是一个bug。
lst=list(a1=data.frame(x=1:10,y=2:11),a2=data.frame(x=1:10,y=-1*2:11))

purrr::iwalk(
  lst,
  ~ ggsave(plot=qplot(data=.x,x=x,y=y,geom="line"),filename=paste(.y,".png"))
)