5

R をいくつかの Java クラスにラップする R 用のパッケージを作成しました。私の開発用ラップトップ (Ubuntu) では、このパッケージが正しく読み込まれ、うまく機能します。他の 2 台のマシン (1 台は Ubuntu、1 台は Debian) でこのパッケージを使用しようとしましたが、.jpackage()呼び出しによってクラスパスが設定されていません。

3 台のマシンはすべて R 2.12.1 と rJava .8-8 を実行しており、これが最新だと思われます。

パッケージ全体はGoogle Codeにありますが、これは zzz.R ファイルの内容です。これは、あるマシンではクラスパスを設定するが、他のマシンでは設定しないように機能します。

##' @import rJava
.onLoad <- function(lib, pkg) {
    pathToSdk <- paste(system.file(package = "GSRadR") , "/gsrad_sample/lib/", sep="")

    jarPaths <- c(paste(pathToSdk, "clima_core-1.0.0.jar", sep=""),
                  paste(pathToSdk, "clima_GSRAD-1.0.0.jar", sep=""),
                  paste(pathToSdk, "colt-1.0.jar", sep=""),
                  paste(pathToSdk, "commons-lang-2.0.jar", sep=""),
                  paste(pathToSdk, "junit-3.8.1.jar", sep=""),
                  paste(pathToSdk, "log4j-1.2.8.jar", sep=""),
                  paste(pathToSdk, "xqore.jar", sep="")
                  )    
    .jpackage(pkg, morePaths=jarPaths)
    attach( javaImport( c("java.lang", "java.io")))
    packageStartupMessage( paste( "GSRadR loaded. The classpath is: ", paste(.jclassPath(), collapse=" " ) ) )        
}

私のラップトップでは、これは次を返します。

> require(GSRadR)
Loading required package: GSRadR
Loading required package: rJava
GSRadR loaded. The classpath is:  /home/jal/R/library/rJava/java /home/jal/R/library/GSRadR/gsrad_sample/lib/clima_core-1.0.0.jar /home/jal/R/library/GSRadR/gsrad_sample/lib/clima_GSRAD-1.0.0.jar /home/jal/R/library/GSRadR/gsrad_sample/lib/colt-1.0.jar /home/jal/R/library/GSRadR/gsrad_sample/lib/commons-lang-2.0.jar /home/jal/R/library/GSRadR/gsrad_sample/lib/junit-3.8.1.jar /home/jal/R/library/GSRadR/gsrad_sample/lib/log4j-1.2.8.jar /home/jal/R/library/GSRadR/gsrad_sample/lib/xqore.jar

しかし、私の他のマシンでは、次のもののみが返されます。

> require(GSRadR)
Loading required package: GSRadR
Loading required package: rJava
GSRadR loaded. The classpath is:  /usr/lib/R/site-library/rJava/java

.jpackage() 呼び出しが異なるマシンで異なる動作をする原因についてのヒントはありますか? 以前にrJavaを使用してパッケージを構築し、.onLoad()関数に同じテンプレートを問題なく使用しました。

編集

そのため、これが機能していないマシンの 1 つで、単に「非パッケージ」の方法でクラス パスにパスを追加しようとしました。そしてそれは失敗しました:

> .jaddClassPath("/home/jal/R/x86_64-pc-linux-gnu-library/2.12/GSRadR/gsrad_sample/lib/clima_core-1.0.0.jar")
> .jclassPath()
[1] "/usr/lib/R/site-library/rJava/java"

うーん...クラスパスに何も追加できません。しかし、なぜ?

編集Ⅱ

動作していないマシンの 1 つにカスタム ライブラリをロードしていたとき、一時的なライブラリの場所を次のように使用していました。

install.packages("/tmp/GSRadR_0.01.tar.gz", lib=/my/path)

次に、次のようにライブラリをロードします。

require(GARadR, lib=/my/path)

試行錯誤の結果、lib=ビットを外せば正常に動作することがわかりました。では、rJava を使用する R パッケージをカスタム ライブラリの場所にロードすると、関数が.jaddClassPath()機能しなくなるのはなぜでしょうか?

私はこれを回避できるかもしれませんが、この奇妙な (少なくとも私にとっては) 動作の原因を知りたいです。

4

1 に答える 1

2

最初の編集のディレクトリまたはファイルが存在しないと思われます: /home/jal/R/x86_64-pc-linux-gnu-library/2.12/GSRadR/gsrad_sample/lib/clima_core-1.0.0.jar. (また、その特定のファイルまたはディレクトリを追加してもよろしいですか?)

試してみてくださいfile.info("/home/jal/R/x86_64-pc-linux-gnu-library/2.12/GSRadR/gsrad_sample/lib/clima_core-1.0.0.jar")

私の場合、試し.jaddClassPath("/willy/wonka")てみましたが、うまくいきませんでした。しかし、試してみると.jaddClassPath("/home/voldemort")、うまくいきました。(Java を分霊箱にしましょう。)

于 2011-07-29T02:36:34.797 に答える