从数据帧列表中绘制多个qqplot并导出到多个pdf但只有1个绘图?

时间:2012-03-28 00:44:55

标签: r

我想通过数据帧列表制作qqplots。我写了这个函数,但我只有1个情节。如果我的列表有3个数据帧,我希望得到3个单独的图,但我只有1个图。任何人都可以告诉我我的代码有什么问题以及为什么lapply在这里不起作用。

myplot <-function(data,obs, cens) {
  detects <- obs[cens== 0]
  pdf(file="Desktop/qqplot.pdf")
  qqnorm(log(detects), ylab="Ln of uncensored data in ppm") 
  dev.off()
}


myplot <- lapply(dfList, function(i) myplot(i, i$obs,i$cens))

2 个答案:

答案 0 :(得分:2)

您创建的pdf文件的名称对于每个绘图都是相同的,因此它会为每个绘图覆盖相同的pdf,并且您只留下最后一个。

您需要在每次迭代时更改pdf文件的名称。您可以尝试这样的事情:

myplot <-function(ind,dfList) {
  dat <- dfList[[ind]]
  detects <- dat$obs[dat$cens== 0]
  pdf(file=paste("Desktop/qqplot_",ind,".pdf",sep = ""))
  qqnorm(log(detects), ylab="Ln of uncensored data in ppm") 
  dev.off()
}


myplot <- lapply(1:n, myplot ,dfList = dfList)

其中n是列表的长度。 (显然,未经测试,但这是一般精神。)

答案 1 :(得分:1)

你可以在一个文件中获得所有的情节,但是,如果这就是你所追求的。 (并避免重新分配myplot

myData <- data.frame(obs = rnorm(100, 10), cens = sample(c(1, 0),
    100, replace = TRUE))

dfList <- list(myData, myData, myData)

在函数中,我删除了data参数,因为它似乎不需要它。

myplot <- function(obs, cens) {
  detects <- obs[which(cens == 0)]
  qqnorm(log(detects), ylab = "Ln of uncensored data in ppm")
}

pdf(file = file.path("/Desktop", "qqplot.pdf"))
myAns <- lapply(dfList, function(i) myplot(obs = i$obs, cens = i$cens))
dev.off()

有了这个建议,三个图表被放在一个PDF文档中,你可以再次使用函数myplot()