我曾经做过一个关于将graphis与外部程序结合起来的博客,并且收到了读者(-click here-)关于在R中使用ghostscript完全实现这一点的极好评论,如下所示。我最近一直在使用它,我想与其他人分享。我想修改它以使函数更直观,并且检测ghostscript类型是我想要做但不能做的一个mod。通过.Platform
可轻松完成unix与windows的对比。关键点是我奋斗的窗户32和64。
如何使用R来检测哪个ghostscript版本(gswin32c或gswin64c)正在运行?仅仅看一下计算机的规格并不够好,因为我在Win 64机器上运行gswin32c。我们的想法是完全删除os参数或将其设置为NULL
并让函数尝试访问此信息。
mergePDF <- function(infiles, outfile, os = "UNIX") {
version <- switch(os,
UNIX = "gs",
Win32 = "gswin32c",
Win64 = "gswin64c")
pre = " -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="
system(paste(paste(version, pre, outfile, sep = ""), infiles, collapse = " "))
}
pdf("file1.pdf", width = 10, height = 8)
plot(1:10, col="red", pch = 19)
dev.off()
pdf("file2.pdf", width = 16, height = 8)
plot(1:10)
dev.off()
mergePDF("file1.pdf file2.pdf", "mergefromR.pdf", "Win32")
答案 0 :(得分:4)
这对我来说有些神圣,但应该完成工作。将其添加为函数的前几行并删除os参数:
testme <- c(UNIX = "gs -version",
Win32 = "gswin32c -version",
Win64 = "gswin64c -version")
os <- names(which(sapply(testme, system) == 0))
我使用了-version
开关,因此R不会尝试不必要地加载Ghostscript。
在我的Ubuntu系统上,当我运行它时,os
按预期返回UNIX
,并且在我安装了32位版本Ghostscript的Windows系统上,它返回{{ 1}}。在运行32位GS的64位机器上试一试,让我知道它是如何工作的。
在阅读Win32
和system()
的帮助页面后,我了解了system2()
,这似乎正是您正在寻找的内容。这是我的Ubuntu系统的实际操作:
Sys.which()
因此,可以在Sys.which(c("gs", "gswin32c", "gswin64c"))
# gs gswin32c gswin64c
# "/usr/bin/gs" "" ""
names(which(Sys.which(c("gs", "gswin32c", "gswin64c")) != ""))
# [1] "gs"
函数中完全跳过OS规范:
mergePDF()
您可能想要进行一些错误检查。如果mergePDF <- function(infiles, outfile) {
gsversion <- names(which(Sys.which(c("gs", "gswin32c", "gswin64c")) != ""))
pre = " -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="
system(paste(paste(gsversion, pre, outfile, sep = ""), infiles, collapse = " "))
}
的长度是&gt;例如,1或者为0,您可能希望停止该功能并提示用户安装Ghostscript或验证其Ghostscript版本。