2016-01-12 13 views
6

Chciałbym włączyć podprogram Fortran w pakiecie R. Zawsze budowałem tylko pakiety za pomocą devtools i roxygen (więc moja wiedza może być dość ograniczona). Dostaję błąd, który uniemożliwia mi zainstalowanie pakietu po jego zbudowaniu, ponieważ nie jest to aplikacja Win32 ...Dlaczego ten pakiet R nie zostanie zainstalowany i jak mogę go naprawić?

Używam Rtools 3.3. Moja informacji sesja:

> 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 

Aby początkowo zbudować pakiet, to uruchomić:

library(devtools) 
library(roxygen2) 

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

Jest to kod Fortran, zapisane jako myFunc.f w pliku /src:

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

     x = x + 2 

     return 
     end 

Opakowanie R używam do wywoływania (zapisywane w pliku /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) 
} 

Teraz, aby tworzyć dokumentację i zainstalować pakiet, to uruchomić:

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

Próbowałem również do budowy i sprawdzić pakiet za pomocą linii komend przy użyciu R CMD build myPack a następnie R CMD check myPack_*tar.gz. Jedyny błąd, jaki robię, jest związany z moim pakietem LaTeX.

Dziękuję za przeczytanie tego i doceniam każdą oferowaną pomoc.

Nota prawna: Zadałem to pytanie wcześniej, ale chciałem zapytać ponownie w "minimalistycznym stylu".

+0

Na szybki rzut oka widzę, że należy przynajmniej zrobić 'return (myCall $ x)' (zamiast obecnego 'zwrotu (mycall $ x) '). –

+0

@ JoshO'Brien Dzięki. To było niechlujstwo z mojej strony. To nie rozwiązało problemu, ale naprawiłem to. – panterasBox

+1

Czy na pewno nie miksujesz plików i386 i x86_64? 'nie można załadować obiektu współużytkowanego 'C: /Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386/mypack.dll':' zawiera 'i386', ale skompilowałeś dla 64bit. –

Odpowiedz

5

Jest oczywiste, że jest to problem z architekturą. Wygląda na to, że wersja x64 pakietu (który prawdopodobnie jest tym, czego potrzebujesz) została zbudowana pomyślnie, ale kompilacja x86, a tym samym całe zadanie, nie powiodła się. Wypróbuj następujące:

  1. Dodaj --no-multiarch opcję połączenia install. Dzięki temu RCmd nie będzie budowane dla x86, ponieważ twoim głównym łukiem jest x64.
  2. (Prawdopodobnie opcjonalnie, ale tylko dla wygody.) Dodaj opcję --no-test-load do połączenia install. Dzięki temu RCmd nie będzie oceniać powodzenia zadania kompilacji przez sukces ładowania pakietu.
  3. Załaduj pakiet ręcznie za pomocą library('myPack') i sprawdź, czy działa.

Podsumowując, należy wymienić swoje wezwanie install z:

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

Dziękuję. Doskonała odpowiedź. Całkowicie warte bounty :) – panterasBox

0

Wygląda na to, ładujesz dyn.load("/src/myPack.dll")

ale podczas instalowania go szuka:

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

(czyli nie kapitał P)

* Niestety nie mam dosyć rep, aby umieścić to jako komentarz.

+0

Pozbyłem się ostrzeżenia i notatki, które napisałem o "Pakiecie niezadeklarowanym w zagranicznych wywołaniach funkcji". Zaktualizowałem pytanie, dzięki. – panterasBox

Powiązane problemy