lapply当两个列表元素的名称都是函数的参数时

时间:2017-06-02 21:37:54

标签: r ggplot2 lapply

我的玩具数据框:

d <- data.frame(
  value = sample(1:10),
  class = sample(c("a","b"), 20, replace = TRUE)
)

我将数据框拆分为&#39; class&#39;并将它们放在一个列表中,每个列表元素在其类之后命名:

l <- dlply(d, .(class), function(x)return(x))

然后我想对每个班级进行补贴并制作直方图。请注意,我不想要一个方面。我希望将多个单独的文件保存为类。所以我定义了一个制作直方图的函数doPlots,然后对它们进行ggsaves(在本例中为a_hist.png和b_hist.png):

doPlots <- function(d, name){
  g <- ggplot(data = d, aes(x=value)) + 
    geom_histogram(binwidth=1)
  ggsave(filename=paste(name,"hist.png",sep="_"))
}

然而,当我屈服时:

lapply(l, FUN=doPlots, name=names(l))

我收到错误:device必须为NULL,字符串或函数。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您的代码存在两个问题,一个是您将整个名称向量传递给函数。其次,您尚未添加要保存到ggsave功能的图表。您可以使用mapply迭代两个或多个列表。

doPlots <- function(d, name){
  g <- ggplot(data = d, aes(x=value)) + 
    geom_histogram(binwidth=1)
  ggsave(filename=paste(name, "hist.png", sep="_"), g)
}

mapply(doPlots, l, names(l))

答案 1 :(得分:0)

考虑基数R by,它将数据帧按因子级别切分为元素列表。您甚至可以在一次通话中将用户定义的功能全部传递到其中:

dlist <- by(d, d$class, FUN=function(i) {      
             name <- max(as.character(i$class))
             doPlots(i, name)      
         })