来自 R PDF 图形设备的损坏的 PDF



>我有一个列表(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()
}

最新更新