我想通过数据帧列表制作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))
答案 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()
。