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