当我使用 中的图表时R
,我尝试将它们直接输出为 PDF。例如,创建图表的代码如下。
library(ggplot2)
levels_fp = ggplot(data=df_forest_2,
aes(x = levels,y=center, ymin=lower, ymax=upper))+
geom_pointrange(aes(col=levels))+
geom_hline(aes(fill=levels),yintercept =1, linetype=2)+
xlab('Outcomes Evaluated')+ geom_errorbar(aes(ymin=lower, ymax=upper,col=levels),width=0.2,cex=1)+
facet_wrap(~outcome,strip.position="top",nrow=1,scales = "free_x") + theme(
axis.title = element_text(size = 18),
axis.text = element_text(size = 14),
legend.text = element_text(size = 16),
legend.title = element_text(size = 16),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black"),
legend.box.background = element_rect(),axis.text.x = element_blank(), strip.text.x = element_text(size = 14)
) + ylab("Odds Ratio")+labs(col="Interventions")
pdf(file="Forest_levels_2.pdf", width=12,height =12 )
levels_fp
dev.off()
我感兴趣的是:假设我保留了pdf(我从上一步中输出的,即Forest_levels_2.pdf)在 PDF 查看器中打开。然后,如果我再次运行该代码,该文件将获得输出并覆盖以前的 PDF,并且 PDF 查看器中的输出也会立即更改。
但是如果我尝试在 Windows 中执行相同的操作,即我使用 PDF 查看器保持 PDF 打开,并且我尝试运行代码,则会出现以下错误 -->无法访问pdf。为什么 Linux 中的行为存在差异(我使用的是 Ubuntu 20.04)?
添加Windows错误的输出
Error in pdf(file = "Forest_levels_2.pdf", width = 12, height = 12) :
cannot open file 'Forest_levels_2.pdf'
为了删除一些变量,我尝试下载适用于Windows的Evince PDF查看器(Evince 2.32),然后在Windows中使用Evince打开PDF并再次进行相同的实验。
猜猜发生了什么!?!
我能够成功修改在 Windows 中打开的 PDF。 Evince 在 Ubuntu 和 Windows 中的工作方式相同。因此,它可能也更依赖于 PDF 查看器的属性。
答案1
这是您正在使用的 PDF 查看器的一项功能。
我怀疑,PDF 查看器打开文件,然后读取/处理内容。它不必关闭文件,但可能会关闭。
接下来,它设置一个inotify
,这意味着如果有人写入该文件,您的 PDF 查看器将会收到通知。
当您写入文件时,您的 PDF 查看器会收到一个信号,表明它正在查看的文件已更改。这使 PDF 查看器有机会重新读取文件并重新处理内容。
Windows 中也可以实现类似的功能,但您使用的 PDF 查看器根本没有实现这一点。当您的 Windows PDF 查看器打开 PDF 时,默认情况下它会获得对该 PDF 文件的独占访问权限,这将导致其他程序在尝试打开该文件进行写入时出现错误。查看器必须进行系统调用以明确放弃独占访问权限,以便以与 Linux 版本类似的方式进行操作。
我发现了一个有趣的维基百科文章关于文件锁定。它说:
Windows 从 MS-DOS 系统继承了共享访问控制的语义,其中共享是在 MS-DOS 3.3 中引入的。因此,应用程序在打开文件时必须明确允许共享;否则,它对文件具有独占的读、写和删除访问权限,直到关闭为止(允许其他类型的访问,例如检索文件属性的访问。)
它还说:
类 Unix 操作系统(包括 Linux 和 Apple 的 macOS)通常不会自动锁定打开的文件。