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.
Auf den ersten Blick sehe ich, dass Sie zumindest tun 'return (MYCALL $ x)' (anstelle der aktuellen 'Rückkehr sollte (mycall $ x) '). –
@ JoshO'Brien Danke. Das war schlampig meinerseits. Es hat das Problem nicht behoben, aber das habe ich behoben. – panterasBox
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. –