如何使用管道和 purrr 获取列表名称和切片名称
How to get list name and slice name with pipe and purrr
我想知道在使用 purrr 进行管道操作时如何获取列表名称或组名称作为标志。例如:我想使用传递给 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")))
slicename(.) 应该类似于 unique(.[["id"]]),但在使用 slice_rows 时不起作用。
listname
和 slicename
不是 purrr
中的函数,并且 names
似乎 return 与 [ 一起使用时列表元素名称=14=]函数。此外,您可能希望使用 walk
系列函数而不是 map
或 by_slice
,因为您调用该函数是为了它的副作用,而不是为了 returned对象。
因此,作为一种解决方法,您可以尝试
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-08-30:"indexed" 映射函数的新系列已在 purrr
0.2.3 中 introduced为 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"))
)
我想知道在使用 purrr 进行管道操作时如何获取列表名称或组名称作为标志。例如:我想使用传递给 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")))
slicename(.) 应该类似于 unique(.[["id"]]),但在使用 slice_rows 时不起作用。
listname
和 slicename
不是 purrr
中的函数,并且 names
似乎 return 与 [ 一起使用时列表元素名称=14=]函数。此外,您可能希望使用 walk
系列函数而不是 map
或 by_slice
,因为您调用该函数是为了它的副作用,而不是为了 returned对象。
因此,作为一种解决方法,您可以尝试
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-08-30:"indexed" 映射函数的新系列已在 purrr
0.2.3 中 introduced为 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"))
)