2016-01-12 19 views
6

Vorrei includere una subroutine Fortran in un pacchetto R. Ho sempre costruito solo pacchetti usando devtools e roxygen (quindi le mie conoscenze potrebbero essere piuttosto limitate). Ricevo un errore che mi impedisce di installare il pacchetto dopo che è stato creato non essendo un'applicazione Win32 ...Perché questo pacchetto R non si installa e come posso ripararlo?

Sto utilizzando Rtools 3.3. Le mie info sessione:

> 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 

Per costruire inizialmente il pacchetto, ho eseguito questo:

library(devtools) 
library(roxygen2) 

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

Questo è il codice FORTRAN, salvato come myFunc.f nel file /src:

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

     x = x + 2 

     return 
     end 

Il wrapper R che sto usando per chiamarlo (salvato nel file /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) 
} 

Ora, per creare la documentazione e installare il pacchetto, corro questo:

> 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) 

ho anche cercato di costruire e controllare il pacchetto tramite la riga di comando utilizzando R CMD build myPack e poi R CMD check myPack_*tar.gz. L'unico errore che ottengo è qualcosa sul mio pacchetto LaTeX.

Grazie per aver letto questo e apprezzo qualsiasi aiuto offerto.

Disclaimer: Ho fatto questa domanda in precedenza, ma volevo chiedere di nuovo in un "minimal fashion".

+0

Ad una rapida occhiata, vedo che si dovrebbe almeno fare 'ritorno (MYCALL $ x)' (al posto del tuo attuale 'ritorno (mycall $ x) '). –

+0

@ JoshO'Brien Grazie. Quello era sciatto da parte mia. Non ha risolto il problema, ma l'ho risolto. – panterasBox

+1

Sei sicuro di non mischiare i file i386 e x86_64? 'impossibile caricare l'oggetto condiviso 'C: /Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386/mypack.dll':' contiene 'i386' ma è stato compilato per 64 bit. –

risposta

5

È chiaro che si tratta di un problema di architettura. Sembra che la versione x64 del tuo pacchetto (che probabilmente è ciò di cui hai bisogno) sia stata compilata correttamente, ma la build di x86 e, quindi, l'attività generale, non è andata a buon fine. Prova il seguente:

  1. Aggiungi opzione a install chiamata. Questo dirà a RCmd di non compilare per x86, perché l'arco principale è x64.
  2. (Probabilmente, facoltativo, ma solo per comodità.) Aggiungi l'opzione --no-test-load alla chiamata install. Questo dirà a RCmd di non giudicare il successo dell'attività di compilazione in seguito al successo del caricamento del pacchetto.
  3. Carica il pacchetto manualmente con library('myPack') e verifica se funziona.

In sintesi, sostituire il install chiamata con:

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

Grazie. Ottima risposta Vale assolutamente la taglia :) – panterasBox

0

Sembra che la tua caricamento dyn.load("/src/myPack.dll")

ma durante installarlo è alla ricerca di:

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

(vale a dire senza la P maiuscola)

* Mi dispiace non hanno abbastanza rappresentante per metterlo come commento.

+0

Questo ha eliminato l'avviso e la nota che ho postato sul pacchetto 'Non dichiarato in chiamate di funzioni straniere '. Ho aggiornato la domanda, grazie. – panterasBox

Problemi correlati