R PDF 图形设备损坏的 PDF

Damaged PDF from R PDF Graphics Device

我有一个列表 (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 return 出现空提示。 当我手动将值 1 分配给 j 并且 运行 循环内的代码时:

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 returns this:

> dev.off()
RStudioGD 
        2

为什么 for 循环会生成损坏的 PDF 文件?

这里发生的是 plot.euler() returns 一个 "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()
}