Почему этот пакет 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.Ф в :

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

         x = x + 2

         return
         end

обертка 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:panterasBoxmyPack" --library="C:UserspanteraAppDataLocalTempRtmpQdJJkodevtools_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:panterasBoxmyPack/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.

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

отказ от ответственности: я задал этот вопрос ранее, но я хотел спросить еще раз "минимальным способом".

2 ответов


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

  1. добавить до install звонок. Это скажет RCmd не строить для x86, потому что ваша основная арка x64.
  2. (наверное, необязательно, но просто для удобства.) Add до install звонок. Это скажет RCmd не судить об успехе задачи сборки по успешности загрузки пакета.
  3. загрузите пакет вручную с помощью library('myPack') и посмотреть, если это работает.

подводя итог, заменить install звонок с:

install('myPack', args=c('--no-multiarch','--no-test-load'))
library('myPack')

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

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

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

(т. е. без капитала P)

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