Почему этот пакет R не устанавливается и как его исправить?

Я хотел бы включить подпрограмму Fortran в пакет R. Я всегда собирал пакеты только с помощью devtools и roxygen (поэтому мои знания могут быть довольно ограниченными). Я получаю сообщение об ошибке, которое не позволяет мне установить пакет после того, как он был создан, о том, что он не является приложением Win32...

Я использую Rtools 3.3. Информация о моем сеансе:

> sessionInfo()
R version 3.2.2 (2015-08-14)
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  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] roxygen2_5.0.1 devtools_1.9.1

loaded via a namespace (and not attached):
[1] magrittr_1.5  tools_3.2.2   Rcpp_0.12.1   memoise_0.2.1 stringi_1.0-1 stringr_1.0.0 digest_0.6.8 

Чтобы изначально собрать пакет, я запускаю это:

library(devtools)
library(roxygen2)

setwd("C:/panterasBox")
create("myPack")
setwd("C:/panterasBox/myPack")
dir.create("C:/panterasBox/myPack/src")

Это код на Фортране, сохраненный как myFunc.f в файле /src:

         subroutine myFunc(x)
         implicit none
         real(8) x

         x = x + 2

         return
         end

Оболочка R, которую я использую для ее вызова (сохраненная в файле /R):

#' @title A test
#' @description a test function.
#' @param x this is a number
#' @useDynLib myPack
#' @export
myFunc <- function(x){
  if (!is.loaded('myFunc')) {
    dyn.load("/src/myPack.dll")
  }
  myCall <- NULL
  myCall <- .Fortran("myFunc", x=as.double(x), PACKAGE="myPack")
  return(myCall$x)
}

Теперь, чтобы создать документацию и установить пакет, я запускаю это:

> document()
Updating myPack documentation
Loading myPack
Re-compiling myPack
"C:/Users/pantera/DOCUME~1/R/R-32~1.2/bin/x64/R" --no-site-file --no-environ --no-save --no-restore CMD INSTALL  \
"C:\panterasBox\myPack" --library="C:\Users\pantera\AppData\Local\Temp\RtmpQdJJko\devtools_install_1df837dd6c29" --no-R  \
--no-data --no-help --no-demo --no-inst --no-docs --no-exec --no-multiarch --no-test-load 

* installing *source* package 'myPack' ...
** libs
gfortran -m64     -O2  -mtune=core2 -c myFunc.f -o myFunc.o
gcc -m64 -shared -s -static-libgcc -o myPack.dll tmp.def myFunc.o -Ld:/RCompile/r-compiling/local/local320/lib/x64 -Ld:/RCompile/r-compiling/local/local320/lib -lgfortran -LC:/Users/pantera/DOCUME~1/R/R-32~1.2/bin/x64 -lR
installing to C:/Users/pantera/AppData/Local/Temp/RtmpQdJJko/devtools_install_1df837dd6c29/myPack/libs/x64
* DONE (myPack)
First time using roxygen2. Upgrading automatically...
Updating roxygen version in  C:\panterasBox\myPack/DESCRIPTION 
Writing NAMESPACE
Writing myFunc.Rd
> install("myPack")
Installing myPack
"C:/Users/pantera/DOCUME~1/R/R-32~1.2/bin/x64/R" --no-site-file --no-environ --no-save --no-restore CMD INSTALL  \
"C:/panterasBox/myPack" --library="C:/Users/pantera/Documents/R/R-3.2.2/library" --install-tests 

* installing *source* package 'myPack' ...
** libs

*** arch - i386
make: Nothing to be done for `all'.
installing to C:/Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386

*** arch - x64
make: Nothing to be done for `all'.
installing to C:/Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/x64
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
Error in inDL(x, as.logical(local), as.logical(now), ...) : 
  unable to load shared object 'C:/Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386/mypack.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/pantera/Documents/R/R-3.2.2/library/myPack'
Error: Command failed (1)

Я также пытался собрать и проверить пакет через командную строку, используя R CMD build myPack, а затем R CMD check myPack_*tar.gz. Единственная ошибка, которую я получаю, связана с моим пакетом LaTeX.

Спасибо, что прочитали это, и я ценю любую предложенную помощь.

Отказ от ответственности: я задавал этот вопрос ранее, но я хотел спросить еще раз в «минимальной манере».


person statsNoob    schedule 12.01.2016    source источник
comment
На первый взгляд, я вижу, что вы должны по крайней мере сделать return(myCall$x) (вместо текущего return(mycall$x)).   -  person Josh O'Brien    schedule 12.01.2016
comment
@ ДжошО'Брайен Спасибо. Это было небрежно с моей стороны. Это не решило проблему, но я исправил это.   -  person statsNoob    schedule 12.01.2016
comment
Вы уверены, что не смешиваете файлы i386 и x86_64? unable to load shared object 'C:/Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386/mypack.dll': содержит i386, но вы скомпилировали для 64-битной версии.   -  person J.J. Hakala    schedule 15.01.2016
comment
Попробуйте переключиться на 32-битный R и повторить, я все еще подозреваю, что вы перепутали бинарники i386 и x86_64. Используйте R.version для проверки.   -  person Patric    schedule 15.01.2016


Ответы (2)


Понятно, что это проблема архитектуры. Похоже, x64-версия вашего пакета (вероятно, то, что вам нужно) была собрана успешно, но сборка x86 и, следовательно, общая задача не удались. Попробуйте следующее:

  1. Добавьте опцию --no-multiarch к вызову install. Это скажет RCmd не собирать для x86, потому что ваша основная архитектура - x64.
  2. (Возможно, необязательно, но просто для удобства.) Добавьте опцию --no-test-load к вызову install. Это скажет RCmd не судить об успехе задачи сборки по успешности загрузки пакета.
  3. Загрузите пакет вручную с помощью library('myPack') и посмотрите, работает ли он.

Подводя итог, замените вызов install на:

install('myPack', args=c('--no-multiarch','--no-test-load'))
library('myPack')
person cyberj0g    schedule 15.01.2016
comment
Спасибо. Отличный ответ. Полностью стоит награды :) - person statsNoob; 19.01.2016

Похоже, вы загружаете dyn.load("/src/myPack.dll")

но при установке ищет:

'C:/Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386/mypack.dll'

(т.е. без заглавной буквы P)

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

person derrek    schedule 12.01.2016
comment
Это избавило от предупреждения и примечания, которое я опубликовал о Undeclared package in foreign function calls. Я обновил вопрос, спасибо. - person statsNoob; 12.01.2016