【问题标题】:Recently updated R / RStudio, rJava could not be loaded.最近更新了 R/RStudio,rJava 无法加载。
【发布时间】:2017-06-05 23:10:00
【问题描述】:

我最近将 R 更新到 3.4 并将 RStudio 更新到其 RStudio v1.0.143 预览版,以便它与 R 的图像更新和绘图兼容,但现在我在尝试加载 rJava 或需要的包时遇到问题它。如下:

Loading required package: rJava
Error: package or namespace load failed for ‘rJava’:
 .onLoad failed in loadNamespace() for 'rJava', details:
 call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so': dlopen(/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: @rpath/libjvm.dylib
Referenced from: 
 /Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/libs/rJava.so
  Reason: image not found
Error: package ‘rJava’ could not be loaded

我目前正在运行 MacOSX 10.12.4 Sierra

非常感谢任何有关如何解决此问题的帮助。

【问题讨论】:

  • 您可能需要从源代码重新安装它,请参阅 R 3.4.0 NEWS 文件。
  • 我已经重新安装了 Java,我还要从源代码重新安装什么?
  • rJava 包可能需要重新安装,因为 R 3.4.0 更改了 .C().Fortran() 调用的解析方式。那是在我指给你的 NEWS 文件中。
  • 从 rstudio 外部安装
  • 卸载它,使用base R(不是RStudio)中的本地(IA)R Cran安装它,仍然得到完全相同的错误。

标签: java r rjava


【解决方案1】:

正如@mko 已经指出的那样,macOS/R/rJava 的混合是一团糟,尽管它非常有用。我一直在为每个版本的几个版本争论这个问题,无论你多么小心,它似乎都会定期再次咬人。也就是说,有很多事情要记住:

  • 您需要安装 JDK,而不仅仅是安装 JRE。
  • 如果不使用已弃用的 Apple 版本的 Java 1.6,R 的 javareconf 脚本将无法正确处理 libjvm.dylib 的位置。
  • 最好使用最新的 JDK 版本以从最新的安全增强功能中受益。
  • R 的javareconf 脚本在升级到新的 Java 版本后无法重新配置 R 正确;它需要重新安装 R 才能正确完成。

所以,记住这些:

  • 安装/更新 JDK。
  • 最好为您计划使用的任何 JDK 安装(通常在 ~/.bashrc~/.bash_profile 中)正确设置 JAVA_HOME
  • 如果尚未安装 XQuartz,请安装(如 @mko 所述)。
  • (重新)安装 R(以允许针对新的 Java 安装进行正确的 R 配置。
  • 使用自定义参数运行 javareconf 脚本,让它针对现代 JDK 进行配置。
  • 将 Java 运行时链接到 R 的库文件夹即可找到它。

对 javareconf 的自定义调用只是终端中的几行代码: 首先,确保 JAVA_HOME 已按要求设置:

# Make sure JAVA_HOME is set as required.
export JAVA_HOME=${JAVA_HOME:-$(/usr/libexec/java_home)}
# Obtain location of Java runtime library.
export LIBJVM=$(find "${JAVA_HOME}" -name 'libjvm.dylib')
# Reconfigure R using custom call to javareconf script.
R CMD javareconf JAVA_LIBS="${LIBJVM}" JAVA_LD_LIBRARY_PATH="${LIBJVM}" JAVA_CPPFLAGS="'-I${JAVA_HOME}/include -I${JAVA_HOME}/include/darwin -I$(dirname "${LIBJVM}")'"
# Link Java runtime to R library folder so it can be found.
ln -fs "$LIBJVM" /Library/Frameworks/R.framework/Libraries

现在您应该可以启动 R 并安装 rJava 了。

如果您使用的是 R 的 Homebrew 安装(需要使用 --with-java 选项安装),请使用此行来链接 Java 运行时:

ln -fs "$LIBJVM" "$(brew --prefix r)/lib"

该过程需要 macOS 上的管理员权限(除非 R 是通过 Homebrew 安装的)。 R 包安装程序授予对各种文件的管理员权限,因此幸运的是,不需要sudo。作为参考,我最近也在这个问题上写了一个简短的article

【讨论】:

  • 知道为什么 rJava 会从原始主目录取消链接吗?似乎当我更新 rJava 所依赖的任何类型的包时,它都会解除绑定。
  • 对于最新版本的 Java/R/rJava,这个问题现在应该已经解决了,您应该不再需要使用这个修复了。我目前正在使用带有 rJava 0.9-10 的 R 3.5.2,并且使用 Java Development Kit 8/10/11/13 对我来说没有问题。
【解决方案2】:

rJava、R、Java 和 macOS 是一团糟。

您可以尝试从源代码重建 rJava。

确保重新配置 Java。由于 javareconf 在涉及 macOS 和 JAVA 时做出了许多强有力的假设(其中之一是,只要您在 JAVA_HOME 变量中有“Home”字样,它就会假设您要使用系统范围的 Java - 不太好想法),你需要:

  • 在 JDK 中创建“人工”主页,例如

    cd /Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents ln -s Home RHome

  • 将 RHome 导出为 JAVA_HOME

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/RHome

使用大量开关运行 javareconf,这些开关将使 gcc 使用基于 JNI 的代码编译

`sudo R CMD javareconf JAVA_HOME=${JAVA_HOME} JAVA=${JAVA_HOME/bin/java JAVAC=${JAVA_HOME}/bin/javac JAVAH=${JAVA_HOME}/bin/javah JAR=${JAVA_HOME}/bin/jar JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/server JAVA_CPPFLAGS="-I${JAVA_HOME}/include -I${JAVA_HOME}/include/darwin"`

下载 rJava 包并尝试手动重建它(在 R 之外)

https://cran.r-project.org/web/packages/rJava/index.html

> curl https://cran.r-project.org/src/contrib/rJava_0.9-8.tar.gz -o rJava_0.9-8.tar.gz
> tar zxf rJava_0.9-8.tar.gz
> cd rJava
> ./configure

如果通过,启动 R(在您设置 env 的同一控制台中)

> install.packages("rJava", type="source")

请注意,对于杂乱无章的 Java 安装(Apple 的 JRE、Oracle 的 JDK),您可能需要首先正确设置 Java 环境。您可能需要一些“肮脏”的技巧,在 JRE 中从 JDK 链接 javacjavahjar。一旦./configure 抱怨缺少命令,您就会知道何时需要这样做。

也可能需要更新文件

`/usr/libexec/java_home`/../Info.plist

并确保您的 JVM 可以处理 JNI。你需要改变:

<key>JVMCapabilities</key>
<array>
  <string>CommandLine</string>
</array>

<key>JVMCapabilities</key>
<array>
  <string>CommandLine</string>
  <string>JNI</string>
</array>

经过一番努力,您可能会使其正常工作。但是,它确实取决于系统。很大程度上取决于您拥有的 R 版本、是否安装了 JDK 以及您的默认 JVM 是什么。

注意!

rJava 需要 XQuartz 进行编译,请务必安装它

https://www.xquartz.org

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 2017-07-12
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多