4

私は以前、グラフィックスと外部プログラムの組み合わせに関するブログを作成したことがあり、以下に示すように、Ghostscript を使用して完全に R 内でこれを実装することについて、読者 ( -ここをクリック -)から素晴らしいコメントを受け取りました。私は最近これを少し使っていて、他の人と共有したいと思っています. 関数をより直感的にするために修正したいのですが、ghostscript の種類を検出することは、私がやりたい 1 つの mod ですが、できません。UNIX と Windows は、 経由で簡単に比較できます.Platform。問題は、私が苦労している Windows 32 と 64 です。

R を使用して、どの Ghostscript バージョン (gswin32c または gswin64c) が実行されているかを検出するにはどうすればよいですか? Windows 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")
4

1 に答える 1

5

タイラー、おい。Stack Ove- R -flowピアからあなたのブログの「読者」に降格されたことがありますか? それともプロモーションですか ;)

これは私には少しハックな気がしますが、仕事を終わらせる必要があります。これを関数の最初の数行として追加し、os 引数を削除します。

testme <- c(UNIX = "gs -version", 
            Win32 = "gswin32c -version", 
            Win64 = "gswin64c -version")
os <- names(which(sapply(testme, system) == 0))

-versionR が不必要に Ghostscript を読み込もうとしないように、スイッチを使用しました。

私の Ubuntu システムでは、これを実行するとos、予想どおり が返されUNIX、32 ビット バージョンの Ghostscript がインストールされている Windows システムでは が返されますWin32。32 ビット GS を実行している 64 ビット マシンで試してみて、どのように動作するか教えてください。


アップデート

system()とのヘルプ ページを読んだ後system2()、 について学びましたSys.which()。これはまさにあなたが探しているものと思われます。ここでは、私の Ubuntu システムで動作しています。

Sys.which(c("gs", "gswin32c", "gswin64c"))
#            gs      gswin32c      gswin64c 
# "/usr/bin/gs"            ""            "" 
names(which(Sys.which(c("gs", "gswin32c", "gswin64c")) != ""))
# [1] "gs"

mergePDF()したがって、OS 仕様は関数内で完全にスキップできます。

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 = " "))
}

エラーチェックを行いたい場合があります。たとえば、 の長さgsversionが > 1 または 0 の場合、関数を停止して、ユーザーに Ghostscript をインストールするか、Ghostscript のバージョンを確認するように求めることができます。

于 2013-01-17T10:04:14.217 に答える