Подтвердить что ты не робот

.onLoad failed в loadNamespace() для 'rJava' при установке пакета

У меня есть пакет "javaOnLoadFailed" (просто минимальный пакет для тестирования моей проблемы, отсюда и странное имя), который импортирует rJava. Я получаю ошибки "rJava", когда пытаюсь либо проверить(), либо установить() пакет, хотя сам запрос (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
4b9b3361

Ответ 1

Переменная среды 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.

Я не совсем понимаю, почему мне нужно указать на 32-разрядную версию Java, чтобы сделать R 64-разрядную работу, но это похоже на то, что происходит.

Кстати, не натыкайтесь на мое имя пакета "javaOnLoadFailed". Я просто создал минимальный пакет с этим именем, чтобы проверить проблему.

Ответ 2

Многие пакеты не работают, потому что они не предназначены для работы на платформе i386, но стандартный процесс установки пытается это сделать. Пользователи тратят много времени на jvm.dll и PATH и JAVA_HOME, когда реальное исправление заключается в том, чтобы заставить установщика просто забыть о i386. Используйте опцию для install.packages. (это также работает, когда используется библиотека drat (кредит относится к Dason)

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

Ответ 3

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

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