r语言 - .onLoad 在 loadNamespace() 中失败,用于安装软件包时'rJava'



我有一个包"javaOnLoadFailed"(只是一个用于测试我的问题的最小包,因此名字很奇怪),它导入了rJava。当我尝试检查()或安装()包时,我收到"rJava"错误,即使require(rJava)本身工作正常。

install() 给出以下错误:

> install()
Installing javaOnloadFailed
"C:/Program Files/R/R-3.2.0/bin/x64/R" --no-site-file --no-environ --no-save  
--no-restore CMD INSTALL  
"C:/Projects/stackoverflow/javaOnloadFailed/javaOnLoadFailed"  
--library="C:/Users/adb2018/Documents/R/win-library/3.2" --with-keep.source  
--install-tests 
* installing *source* package 'javaOnloadFailed' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
Error : .onLoad failed in loadNamespace() for 'rJava', details:
  call: inDL(x, as.logical(local), as.logical(now), ...)
  error: unable to load shared object 'C:/Users/adb2018/Documents/R/win-library/3.2/rJava/libs/i386/rJava.dll':
  LoadLibrary failure:  %1 is not a valid Win32 application.
Error: loading failed
Execution halted
*** arch - x64
ERROR: loading failed for 'i386'
* removing 'C:/Users/adb2018/Documents/R/win-library/3.2/javaOnloadFailed'
Error: Command failed (1)

我正在从架构师中使用 R 3.2.0,带有 sessionInfo():

R version 3.2.0 (2015-04-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     
other attached packages:
[1] devtools_1.7.0.9000 rj_2.0.3-2         
loaded via a namespace (and not attached):
[1] tools_3.2.0   rj.gd_2.0.0-1

Java 环境变量为空

> Sys.getenv('JAVA')
[1] ""

根据建议,我尝试将 JAVA 环境变量设置为指向 64 位版本的 Java(因为我运行的是 R 64 位,正如您从 sessionInformation 中看到的那样,但这不起作用:

> Sys.setenv(JAVA_HOME='C:\Program Files\Java\jre1.8.0_45')
> install()
Installing javaOnloadFailed
"C:/Program Files/R/R-3.2.0/bin/x64/R" --no-site-file --no-environ --no-save  
  --no-restore CMD INSTALL  
  "C:/Projects/stackoverflow/javaOnloadFailed/javaOnLoadFailed"  
  --library="C:/Users/adb2018/Documents/R/win-library/3.2" --with-keep.source  
  --install-tests 
* installing *source* package 'javaOnloadFailed' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
Error : .onLoad failed in loadNamespace() for 'rJava', details:
  call: inDL(x, as.logical(local), as.logical(now), ...)
  error: unable to load shared object 'C:/Users/adb2018/Documents/R/win-library/3.2/rJava/libs/i386/rJava.dll':
  LoadLibrary failure:  %1 is not a valid Win32 application.
Error: loading failed
Execution halted
*** arch - x64
ERROR: loading failed for 'i386'
* removing 'C:/Users/adb2018/Documents/R/win-library/3.2/javaOnloadFailed'
Error: Command failed (1)

然后,我尝试设置 JAVA 环境变量,使其指向我的系统上的 32 位 Java 版本,然后它就可以工作了!

> Sys.setenv(JAVA_HOME='C:\Program Files (x86)\Java\jre1.8.0_45\')
> install()
Installing javaOnloadFailed
"C:/Program Files/R/R-3.2.0/bin/x64/R" --no-site-file --no-environ --no-save  
  --no-restore CMD INSTALL  
  "C:/Projects/stackoverflow/javaOnloadFailed/javaOnLoadFailed"  
  --library="C:/Users/adb2018/Documents/R/win-library/3.2" --with-keep.source  
  --install-tests 
* installing *source* package 'javaOnloadFailed' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
*** arch - x64
* DONE (javaOnloadFailed)
[INFO] Updating the R environment index started...
[INFO] The R environment index was updated successfully.

我不太明白为什么我需要指向 Java 32 位才能使 R 64 位工作,但情况似乎就是这样。

顺便说一下,不要偶然发现我的软件包名称"javaOnLoadFailed"。我刚刚创建了一个具有该名称的最小包来测试问题。

许多软件包安装失败,因为它们不适合在 i386 平台上运行,但标准安装过程会尝试这样做。用户在jvm.dll和PATH JAVA_HOME上浪费了大量时间,而真正的解决方法是强制安装的忘记i386。使用安装包的选项。(这在使用 DRAT 库时也有效。(功劳归于达森)

install.packages("SqlRender",INSTALL_opts="--no-multiarch")
我在

尝试安装仅在 Github 中可用的软件包时发现了同样的问题。
这为我解决了:

devtools::install_github("snowflakedb/dplyr-snowflakedb", INSTALL_opts=c("--no-multiarch"))

请记住,问题是 R 不知道 jvm.dll 在哪里。设置JAVA_HOME时使用包含 dll 文件的目录的路径。您可以在binclientbinserver中找到它。然后,该命令变为:

Sys.setenv(JAVA_HOME='C:\Program Files\Java\jre1.8.0_45\bin\client')

我尝试删除JAVA_HOME系统变量,它可以工作。这样当你启动R时,Sys.getenv("JAVA_HOME")给你"".

最新更新