Rstudio的Knit按钮无法加载rJava。

11

Rstudio的knit按钮无法对包含rJava包的rmarkdown(Rmd)文件进行编织。但是,如果我使用rmarkdown :: render(),同样的Rmd文件可以轻松地呈现为html。

我可以通过以下代码重现错误:

test.Rmd的内容:

---
title: "test"
output: html_document
---

```{r}
library(rJava)
```

点击Knit按钮将返回以下内容:
processing file: test.Rmd

Error : .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.3/Resources/library/rJava/libs/rJava.so':
  dlopen(/Library/Frameworks/R.framework/Versions/3.3/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: @rpath/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.3/Resources/library/rJava/libs/rJava.so
  Reason: image not found
Quitting from lines 7-8 (test.Rmd) 
Error: package or namespace load failed for 'rJava'
Execution halted

使用 rmarkdown::render("test.Rmd") 没问题。同时,在 RStudio 中正常运行 library(rJava) 也没有问题。

使用的软件版本为:RStudio 1.0.136,knitr 1.15.1,rmarkdown 1.3,rJava 0.9-8,R 3.3.2,macOS Sierra 10.12。

更新:根据 @r2evans 的要求添加了 Sys.getenv() 的输出结果。DYLD_FALLBACK_LIBRARY_PATH 的值有所不同,但我不知道这是否重要。我用 XXX 替换了一些私人信息。

在 Knit 按钮生成的 html 文件中:

## __CF_USER_TEXT_ENCODING
##                       0x1F5:0x0:0x52
## Apple_PubSub_Socket_Render
##                       /private/tmp/com.apple.launchd.HvKScioyGU/Render
## DISPLAY               :0
## DYLD_FALLBACK_LIBRARY_PATH
##                       /Library/Frameworks/R.framework/Resources/lib
## EDITOR                vi
## GIT_ASKPASS           rpostback-askpass
## HOME                  XXX
## LANG                  en_CA.UTF-8
## LC_CTYPE              en_CA.UTF-8
## LN_S                  ln -s
## LOGNAME               XXX
## MAKE                  make
## NOT_CRAN              true
## PAGER                 /usr/bin/less
## PATH                  /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin
## PWD                   XXX
## R_ARCH                
## R_BROWSER             /usr/bin/open
## R_BZIPCMD             /usr/bin/bzip2
## R_DOC_DIR             /Library/Frameworks/R.framework/Resources/doc
## R_GZIPCMD             /usr/bin/gzip
## R_HOME                /Library/Frameworks/R.framework/Resources
## R_INCLUDE_DIR         /Library/Frameworks/R.framework/Resources/include
## R_LIBS                /Library/Frameworks/R.framework/Versions/3.3/Resources/library
## R_LIBS_SITE           
## R_LIBS_USER           ~/Library/R/3.3/library
## R_PAPERSIZE           a4
## R_PAPERSIZE_USER      a4
## R_PDFVIEWER           /usr/bin/open
## R_PLATFORM            x86_64-apple-darwin13.4.0
## R_PRINTCMD            lpr
## R_QPDF                /Library/Frameworks/R.framework/Resources/bin/qpdf
## R_RD4PDF              times,inconsolata,hyper
## R_SESSION_TMPDIR      /var/folders/15/vdvn4fvx0zn0gc93_5krp6h00000gn/T//RtmpiYlwpU
## R_SHARE_DIR           /Library/Frameworks/R.framework/Resources/share
## R_SYSTEM_ABI          osx,gcc,gxx,gfortran,?
## R_TEXI2DVICMD         /usr/local/bin/texi2dvi
## R_UNZIPCMD            /usr/bin/unzip
## R_ZIPCMD              /usr/bin/zip
## RMARKDOWN_MATHJAX_PATH
##                       /Applications/RStudio.app/Contents/Resources/resources/mathjax-26
## RMARKDOWN_PREVIEW_DIR
##                       /var/folders/15/vdvn4fvx0zn0gc93_5krp6h00000gn/T//RtmpLe3D9z
## RS_RPOSTBACK_PATH     /Applications/RStudio.app/Contents/MacOS/rpostback
## RS_SHARED_SECRET      XXX
## RSTUDIO               1
## RSTUDIO_PANDOC        /Applications/RStudio.app/Contents/MacOS/pandoc
## RSTUDIO_SESSION_PORT
##                       XXX
## RSTUDIO_USER_IDENTITY
##                       XXX
## RSTUDIO_WINUTILS      bin/winutils
## SED                   /usr/bin/sed
## SHELL                 /bin/bash
## SHLVL                 0
## SSH_AUTH_SOCK         XXX
## TAR                   /usr/bin/tar
## TMPDIR                /var/folders/15/vdvn4fvx0zn0gc93_5krp6h00000gn/T/
## USER                  XXX
## XPC_FLAGS             0x0
## XPC_SERVICE_NAME      0

在使用rmarkdown::render()后生成的文件中:
## __CF_USER_TEXT_ENCODING
##                       0x1F5:0x0:0x52
## Apple_PubSub_Socket_Render
##                       /private/tmp/com.apple.launchd.HvKScioyGU/Render
## DISPLAY               :0
## DYLD_FALLBACK_LIBRARY_PATH
##                       /Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Users/Jayme/lib:/usr/local/lib:/usr/lib::::::::
## EDITOR                vi
## GIT_ASKPASS           rpostback-askpass
## HOME                  XXX
## LANG                  en_CA.UTF-8
## LC_CTYPE              en_CA.UTF-8
## LN_S                  ln -s
## LOGNAME               XXX
## MAKE                  make
## PAGER                 /usr/bin/less
## PATH                  /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin
## R_BROWSER             /usr/bin/open
## R_BZIPCMD             /usr/bin/bzip2
## R_DOC_DIR             /Library/Frameworks/R.framework/Resources/doc
## R_GZIPCMD             /usr/bin/gzip
## R_HOME                /Library/Frameworks/R.framework/Resources
## R_INCLUDE_DIR         /Library/Frameworks/R.framework/Resources/include
## R_LIBS_SITE           
## R_LIBS_USER           ~/Library/R/3.3/library
## R_PAPERSIZE           a4
## R_PDFVIEWER           /usr/bin/open
## R_PLATFORM            x86_64-apple-darwin13.4.0
## R_PRINTCMD            lpr
## R_QPDF                /Library/Frameworks/R.framework/Resources/bin/qpdf
## R_RD4PDF              times,inconsolata,hyper
## R_SESSION_TMPDIR      /var/folders/15/vdvn4fvx0zn0gc93_5krp6h00000gn/T//RtmpLe3D9z
## R_SHARE_DIR           /Library/Frameworks/R.framework/Resources/share
## R_SYSTEM_ABI          osx,gcc,gxx,gfortran,?
## R_TEXI2DVICMD         /usr/local/bin/texi2dvi
## R_UNZIPCMD            /usr/bin/unzip
## R_ZIPCMD              /usr/bin/zip
## RMARKDOWN_MATHJAX_PATH
##                       /Applications/RStudio.app/Contents/Resources/resources/mathjax-26
## RS_RPOSTBACK_PATH     /Applications/RStudio.app/Contents/MacOS/rpostback
## RS_SHARED_SECRET      XXX
## RSTUDIO               1
## RSTUDIO_PANDOC        /Applications/RStudio.app/Contents/MacOS/pandoc
## RSTUDIO_SESSION_PORT
##                       XXX
## RSTUDIO_USER_IDENTITY
##                       XXX
## RSTUDIO_WINUTILS      bin/winutils
## SED                   /usr/bin/sed
## SHELL                 /bin/bash
## SSH_AUTH_SOCK         XXX
## TAR                   /usr/bin/tar
## TMPDIR                /var/folders/15/vdvn4fvx0zn0gc93_5krp6h00000gn/T/
## USER                  XXX
## XPC_FLAGS             0x0
## XPC_SERVICE_NAME      0

更新2 根据@r2evans的评论

.Rmd中包含来自render()DYLD_FALLBACK_LIBRARY_PATH如预期地更改了Sys.getenv()的结果,但是使用knit按钮时出现错误(与上述相同的错误消息),而在render()中没有错误。新的.Rmd内容如下:

---
title: "test2"
output: html_document
---

```{r}
Sys.setenv(DYLD_FALLBACK_LIBRARY_PATH="/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Users/Jayme/lib:/usr/local/lib:/usr/lib::::::::")
library(rJava)
```

有趣的是,在此 test2.Rmd 文件中使用 render(),并包括 Sys.getenv(),现在输出了两个新变量,这些变量之前不存在,并且使用 knit 按钮也不存在:

## DYLD_LIBRARY_PATH     /Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/jre/lib/server
## LD_LIBRARY_PATH       :@JAVA_LD@

我不知道这是否有意义,但我尝试了一个新的.Rmd文件(如下),仍然出现相同的错误。

---
title: "test3"
output: html_document
---

```{r}
Sys.setenv(DYLD_FALLBACK_LIBRARY_PATH="/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Library/Frameworks/R.framework/Resources/lib:/Users/Jayme/lib:/usr/local/lib:/usr/lib::::::::")
Sys.setenv(DYLD_LIBRARY_PATH="/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/jre/lib/server")
Sys.setenv(LD_LIBRARY_PATH= ":@JAVA_LD@")
library(rJava)
```

renderknit中运行Sys.getenv()可能会很有启发性。寻找差异,特别是在PATH和任何LIB相关变量中。 - r2evans
@r2evans 已更新问题并提供所需信息。 - JG11235
1
你有查找 libjvm.dylib 的位置吗?我建议在额外的 DYLD_FALLBACK_LIBRARY_PATH 路径中寻找(从第二个列表开始)。如果你在那里找到了它,请尝试使用附加路径更新该变量(很可能在 .Rmd 文件中)。 - r2evans
感谢@r2evans的帮助。从Knit按钮(/Library/Frameworks/R.framework/Resources/lib)中的DYLD_FALLBACK_LIBRARY_PATH中没有libjvm.dylib文件,但是在render()的路径之一中有(/usr/local/lib)。我应该将此文件(它是别名)复制到/Library/Frameworks/R.framework/Resources/lib中吗?还是在.Rmd文件中写点什么?这个问题是否与这些软件包有关,还是我的机器配置错误?我尝试在加载rJava之前添加Sys.setenv(DYLD_FALLBACK_LIBRARY_PATH="/usr/local/lib"),但在编织时出现错误。 - JG11235
我建议不要将库复制到另一个目录中:一旦您升级了Java系统安装,由于混合库版本,您将遇到大量其他错误。我认为在.Rmd中分配完整的路径集(而不仅仅是一个)就足够了。您可以尝试使用完整值的DYLD_...,并更新您的问题,其中包含仍然触发相同错误的示例Rmarkdown。 - r2evans
显示剩余6条评论
3个回答

8
在命令行上运行以下命令可以解决这个问题:
sudo R CMD javareconf

1
我遇到了和你一样的问题。在Rstudio R控制台中加载rJava没有问题,但在knitting HTML文件时却无法加载。像你一样,我也能够使用render()命令在“knit”中加载rJava。我没有像你那样进行广泛的测试,但最终通过遵循neilfws在评论中提供给你的链接成功地在“knit”过程中加载了rJava。

https://dev59.com/JV0a5IYBdhLWcg3wD1Pb

然后我按照yuan(https://stackoverflow.com/users/5697305/yuan)的建议,在R中使用以下命令直接加载库:

dyn.load('/Library/Java/JavaVirtualMachines/jdk1.8.0[YOURVERSIONHERE].jdk/Contents/Home/jre/lib/server/libjvm.dylib')

在RMarkdown文件中插入这行代码不会影响控制台的正常行为,但是允许使用“knit”按钮进行编织。我从未弄清为什么,但这个解决方案有效。

0
你知道你正在使用哪个Java吗?我对Java的了解不足以知道我的经验是否有所帮助,但是当我尝试重现您的错误时,我被指向了这个网站:

https://support.apple.com/kb/DL1572?locale=en_US

我在哪里下载并安装了适用于OS X 10.11 El Capitan、OS X 10.10 Yosemite、OS X 10.9 Mavericks、OS X 10.8 Mountain Lion和OS X 10.7 Lion的旧版Java 6运行时?这样做是否解决了您的错误?

我正在使用Sierra 10.12.3的MacBook Pro,RStudio 1.0.136,rJava_0.9-8。


我正在使用Java版本8更新121(来自https://www.java.com/en/download/installed8.jsp的测试)。一段时间以前,我遇到了一些与RJava相关的问题,并记得这个传统的Java 6作为一个解决方案,但是我通过https://dev59.com/JV0a5IYBdhLWcg3wD1Pb上的一些答案解决了它们。我不认为这是一个Java问题,因为这些函数在编织范围之外工作得很好。 - JG11235
它能够在不使用RStudio Knit按钮的情况下正常工作,这是一个很好的优点。 - Fred Boehm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接