【发布时间】:2011-02-23 20:59:56
【问题描述】:
我已经为 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() 函数工作呢?
我也许可以解决这个问题,但我很想知道是什么导致了这种奇怪的(至少对我而言)行为。
【问题讨论】:
-
rJava 有一个帮助列表 IIRC。你可以在那里试试运气。
-
问题 1:您没有引用
lib=值。这是代码中的错误还是粘贴到 StackOverflow 的影响? -
问题 2:执行 install/require 的账户是否对指定的
lib目录有写权限?在多台机器上或与多个用户一起运行代码时,我被它咬到了。 -
另一个建议,正如 Elmer Fudd 可能会说的(所以它牢牢记住):在使用
R CMD javareconf时要小心谨慎,小心谨慎。当命运眷顾你时,它会解决各种 R 和 Java 问题。当命运真的恨你的时候,就会有人来夺走你在那台机器上的特权。如果可能,请让其他人运行该命令。理想情况下,在该机器上安装 Java 的人。幸运眷顾有准备的人。