我已经为R构建了一个包,它将R包装在一些Java类中.在我的开发笔记本电脑(Ubuntu)上,这个软件包加载正常,效果很好.在另外两台机器(一台Ubuntu,一台Debian)上,我试图使用这个包,并且.jpackage()
调用没有设置类路径.
所有三台机器都运行R 2.12.1和rJava .8-8,我认为这是最新的.
整个软件包都在谷歌代码上,但这里是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"
嗯...所以我无法在课程路径中添加任何内容.但为什么?
编辑二
当我将自定义库加载到其中一台无法正常工作的计算机上时,我使用的是临时库位置,如下所示:
install.packages("/tmp/GSRadR_0.01.tar.gz", lib=/my/path)
然后像这样加载库:
require(GARadR, lib=/my/path)
我通过反复试验发现,如果我移除lib=
钻头它会正常工作.那么为什么要将使用rJava的R包加载到自定义库位置以防止该.jaddClassPath()
函数工作?
我或许可以解决这个问题,但我很想知道是什么导致了这种奇怪的行为(至少对我而言).