.ошибка 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 изнутри Architect, с 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

3 ответов


переменная среды Java пуста

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

на основе предложение, Я попытался установить переменную среды JAVA, чтобы указать на 64-битную версию Java (потому что я запускаю R 64 бит, как вы могли видеть из sessionInfo, но это не работает:

> 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 и путь и JAVA_HOME, когда реальное исправление заключается в том, чтобы заставить установленный просто забыть о i386. Используйте опцию для установки.пакеты. (это также работает, когда используется библиотека drat. (заслуга Дасона)

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

помните, что проблема в том, что R не знает, где jvm.dll есть. При установке JAVA_HOME используйте путь к каталогу, который содержит dll-файл. Вы можете найти его в bin\client или bin\server. Затем команда становится:

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