【问题标题】:How to get list name and slice name with pipe and purrr如何使用管道和 purrr 获取列表名称和切片名称
【发布时间】:2016-04-22 10:31:48
【问题描述】:

我想知道当使用带有 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 时它不起作用。

【问题讨论】:

    标签: r ggplot2 pipe purrr


    【解决方案1】:

    值得一提的是,使用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"))
    )
    

    2017 年 8 月 30 日更新:一个新的“索引”映射函数系列在 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"))
    )
    

    【讨论】:

      【解决方案2】:

      listnameslicename 不是 purrr 中的函数,names 在与 purrr 函数一起使用时似乎不会返回列表元素名称。此外,您可能希望使用walk 系列函数而不是mapby_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")))
      

      【讨论】:

      • 谢谢!那么这是分组data.frame的最佳方式吗: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(unique(df[["id"]]))) %>% pwalk( ~ ggsave(plot=qplot(data=.x,x=x,y=y,geom="line"),filename=paste(.y,".png")))
      • 如果 unique(df[["id"]]) 是一个因素而不是一个字符类,结果是不同的(1.png,2.png),也许这是一个错误。
      猜你喜欢
      • 2018-04-05
      • 2022-08-09
      • 2013-11-07
      • 1970-01-01
      • 2018-12-09
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多