【问题标题】:rJava classpath in an R package... works on some systems... not othersR 包中的 rJava 类路径...适用于某些系统...不适用于其他系统
【发布时间】: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 的人。幸运眷顾有准备的人。

标签: r classpath rjava


【解决方案1】:

我怀疑第一次编辑中的目录或文件不存在:/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 成为你的灵魂。)

【讨论】:

  • 我已经有几个月没有遇到这个问题了。我会尝试挖掘代码,看看我是如何解决它的。感谢您的 cmets 和回答!
  • 是的,已经过了一段时间。 :) 我正在处理未回答的问题。关于 SO 的大多数未回答的问题都很无聊,但不是这个。如果我能消除枯燥的问题,那就太好了。 ;-)
  • 哈!有趣的。好吧,我很高兴我没有问一个无聊的问题!
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2014-12-30
相关资源
最近更新 更多