2016-01-12 2 views
6

Я хотел бы включить подпрограмму Fortran в пакет R. Я всегда только создавал пакеты с помощью devtools и roxygen (поэтому мои знания могут быть довольно ограниченными). Я получаю сообщение об ошибке, которое мешает мне получить пакет после его создания после того, как он не был приложением Win32 ...Почему этот пакет R не устанавливается и как его исправить?

Я использую 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.f в /src файле:

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

     x = x + 2 

     return 
     end 

Обертка R, которую я использую для ее вызова (сохранена в файле /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:\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) 

Я также попытался построить и проверить пакет с помощью командной строки, используя R CMD build myPack, а затем R CMD check myPack_*tar.gz. Единственная ошибка, которую я получаю, это что-то в моем пакете LaTeX.

Благодарим вас за это, и я ценю любую предлагаемую помощь.

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

+0

На первый взгляд, я вижу, что вы должны, по крайней мере, сделать 'возврата (MYCALL $ х)' (вместо текущего 'возвращения (MYCALL $ х) '). –

+0

@ JoshO'Brien Спасибо. Это было неряшливо с моей стороны. Это не устранило проблему, но я это исправил. – panterasBox

+1

Вы уверены, что не используете файлы i386 и x86_64? 'невозможно загрузить общий объект 'C: /Users/pantera/Documents/R/R-3.2.2/library/myPack/libs/i386/mypack.dll':' содержит 'i386', но вы скомпилированы для 64-битного. –

ответ

5

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

  1. Добавить --no-multiarchinstall позвонить. Это скажет RCmd не строить для x86, потому что ваша основная арка - x64.
  2. (Возможно, дополнительно, но только для удобства.) Добавить --no-test-load вариант install звонок. Это скажет RCmd, чтобы не судить о успехе задачи сборки при успешном загрузке пакета.
  3. Загрузите упаковку вручную с помощью library('myPack') и проверьте, не работает ли она.

Подводя итог, заменить install вызов:

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

Спасибо. Отличный ответ. Всего стоит щедрость :) – panterasBox

0

Похоже, ваши загружаются dyn.load("/src/myPack.dll")

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

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

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

* К сожалению я не хватит rep, чтобы выразить это как комментарий.

+0

Это избавилось от предупреждения и примечания, которое я опубликовал о 'Undeclared package in foreign functions calls'. Я обновил вопрос, спасибо. – panterasBox

Смежные вопросы