如何使用pipe和purrr获取列表名称和切片名称

ear*_*ate 6 r pipe ggplot2 purrr

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

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")))
Run Code Online (Sandbox Code Playgroud)

slicename(.)应该是唯一的(.[["id"]]),但是当使用slice_rows时它不起作用.

Wal*_*ltS 5

listname并且slicename不是函数,purrr并且names在与purrr函数一起使用时似乎不会返回列表元素名称。此外,您可能希望使用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")) )
Run Code Online (Sandbox Code Playgroud)

添加

如果您从数据框开始,则可以使用

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


mba*_*ask 5

值得一提的是,使用purrr::walk2一个可以避免使用lstnames(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"))
)
Run Code Online (Sandbox Code Playgroud)

更新二零一七年八月三十零日:的“索引”功能的地图一类新的已经推出purrr0.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))

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