2016-01-12 4 views
6

Ich möchte ein Fortran-Unterprogramm in einem R-Paket enthalten. Ich habe immer nur Pakete mit Devtools und Roxygen gebaut (mein Wissen kann also ziemlich begrenzt sein). Ich erhalte einen Fehler, der verhindert, dass das Paket installiert wird, nachdem es erstellt wurde, weil es keine Win32-Anwendung ist ...Warum wird dieses R-Paket nicht installiert und wie kann ich es reparieren?

Ich verwende Rtools 3.3. Meine Session info:

> 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 

zunächst das Paket zu erstellen, ich laufe dies:

library(devtools) 
library(roxygen2) 

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

Dies ist der Fortran-Code, gespeichert als myFunc.f in der /src Datei:

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

     x = x + 2 

     return 
     end 

Der R-Wrapper, den ich benutze, um ihn aufzurufen (gespeichert in der Datei /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) 
} 

, nun in die Dokumentation zu erstellen und das Paket installieren, ich laufe dies:

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

Ich habe auch das Paket über die Befehlszeile mit R CMD build myPack und dann R CMD check myPack_*tar.gz zu bauen und überprüfen versucht. Der einzige Fehler, der dabei auftritt, ist etwas an meinem LaTeX-Paket.

Vielen Dank für das Lesen, und ich schätze jede Hilfe angeboten.

Haftungsausschluss: Ich habe diese Frage vorher gestellt, aber ich wollte noch einmal "minimal" fragen.

+0

Auf den ersten Blick sehe ich, dass Sie zumindest tun 'return (MYCALL $ x)' (anstelle der aktuellen 'Rückkehr sollte (mycall $ x) '). –

+0

@ JoshO'Brien Danke. Das war schlampig meinerseits. Es hat das Problem nicht behoben, aber das habe ich behoben. – panterasBox

+1

Sind Sie sicher, dass Sie keine i386- und x86_64-Dateien mischen? 'Shared-Objekt kann nicht geladen werden C: /Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386/mypack.dll ':' enthält 'i386', aber Sie haben für 64bit kompiliert. –

Antwort

5

Es ist klar, dass dies ein Architekturproblem ist. Sieht aus wie X64-Version Ihres Pakets (die wahrscheinlich ist, was Sie brauchen) wurde erfolgreich erstellt, aber x86-Build und damit die Gesamtaufgabe fehlgeschlagen. Versuchen Sie Folgendes:

  1. Fügen Sie die --no-multiarch Option zu install hinzu. Das sagt RCmd nicht für x86 zu bauen, weil Ihr Hauptbogen x64 ist.
  2. (Wahrscheinlich, optional, aber nur für die Bequemlichkeit.) Fügen Sie --no-test-load Option zu install Anruf hinzu. Dies wird RCmd mitteilen, den Erfolg der Build-Task nicht zu beurteilen, wenn das Paket erfolgreich geladen wurde.
  3. Laden Sie das Paket manuell mit library('myPack') und sehen, ob es funktioniert.

Um es zusammenzufassen, ersetzen Sie install Anruf mit:

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

Vielen Dank. Ausgezeichnete Antwort. Total wert das Kopfgeld :) – panterasBox

0

Es sieht aus wie Ihr laden dyn.load("/src/myPack.dll")

aber während es installieren sucht:

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

(dh kein Kapital P)

* Leider habe ich nicht genug rep, um das als Kommentar zu setzen.

+0

Dies löschte die Warnung und Notiz, die ich über das 'Nicht deklarierte Paket in fremden Funktionsaufrufen 'gepostet hatte. Ich habe die Frage aktualisiert, danke. – panterasBox

Verwandte Themen