>我有一个列表(eulerr.list
(,其中包含可以用eulerr
绘制欧拉图的数据框。 我想为列表中的每个数据框绘制和保存欧拉图。为此,我编写了以下代码:
for (j in 1: length(eulerr.list)) {
pdf(file=paste0("output/","triple_","eulerr_",names(eulerr.list[j]),".pdf"))
plot(eulerr.list[[j]],
fills = c("red", "forestgreen", "mediumorchid"),
quantities = TRUE,
alpha = 0.5,
labels = c("A",
"B",
names(eulerr.list[j])),
adjust_labels = TRUE)
dev.off()
}
当我运行循环(RStudio 版本 1.3.959(时,我得到了我期望的文件,但所有文件都已损坏(无法通过 Mac 上的预览 (OSX 10.12.6( 打开(。循环完成后,没有错误消息,Rstudio 返回一个空提示。 当我手动为j
分配值 1 并在循环中运行代码时:
pdf(file=paste0("output/","triple_","eulerr_",names(eulerr.list[j]),".pdf"))
plot(eulerr.list[[j]],
fills = c("red", "forestgreen", "mediumorchid"),
quantities = TRUE,
alpha = 0.5,
labels = c("A",
"B",
names(eulerr.list[j])),
adjust_labels = TRUE)
dev.off()
然后正确生成文件(可以在预览中查看(,RStudio 返回以下内容:
> dev.off()
RStudioGD
2
为什么for
循环会生成损坏的 PDF 文件?
这里发生的事情是plot.euler()
返回一个"eulergram"
对象。然后,要在当前设备上实际绘制此图,必须调用print.eulergram()
(或plot.eulergram()
(方法,但这并不是因为调用位于 for 循环内。以交互方式调用plot()
时,返回的对象实际上隐式调用了其print()
方法。这与人们对 ggplot 或 lattice 遇到的问题完全相同。
你需要做的是保存对象免受plot()
并在其上调用print()
(或plot()
(,如下所示:
for (j in 1: length(eulerr.list)) {
pdf(file=paste0("output/","triple_","eulerr_",names(eulerr.list[j]),".pdf"))
p <- plot(eulerr.list[[j]],
fills = c("red", "forestgreen", "mediumorchid"),
quantities = TRUE,
alpha = 0.5,
labels = c("A",
"B",
names(eulerr.list[j])),
adjust_labels = TRUE)
print(p)
dev.off()
}