R包中的rJava类路径...适用于某些系统...而不适用于其他系统

时间:2011-02-23 20:59:57

标签: r classpath rjava

我已经为R构建了一个包,它将R包装在一些Java类中。在我的开发笔记本电脑(Ubuntu)上,这个软件包加载正常,效果很好。在另外两台机器(一台Ubuntu,一台Debian)上,我试图使用这个包,并且.jpackage()调用没有设置类路径。

所有三台机器都运行R 2.12.1和rJava .8-8,我相信这是最新的。

整个包是up at 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()函数使用了相同的模板,没有任何问题。

修改

所以在其中一台机器没有工作的地方,我试着简单地在类路径中添加“非包”方式的路径。那次失败了:

> .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"

嗯...所以我无法在类路径中添加任何内容。但为什么呢?

编辑II

当我将自定义库加载到其中一台无法正常工作的计算机上时,我正在使用临时库位置,如下所示:

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

然后像这样加载库:

require(GARadR, lib=/my/path)

我通过反复试验发现,如果我删除lib=位,它将正常工作。那么为什么要将使用rJava的R包加载到自定义库位置,以使.jaddClassPath()函数无法正常工作?

我或许可以解决这个问题,但我很想知道造成这种奇怪(至少对我而言)行为的原因。

1 个答案:

答案 0 :(得分: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成为你的灵魂。)