2016-01-12 83 views
6

我想在R包中包含一个Fortran子例程。我一直只使用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") 

这是Fortran代码,在/src文件保存为myFunc.f:

  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 $ X)'(而非目前'回报(的MyCall $ X)')。 –

+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-multiarch选项添加到install调用。这将告诉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)

*对不起,我没有足够的代表将其作为评论。

+0

这摆脱了警告,并注意到我发布了关于“在外部函数调用中未声明的包”。我更新了问题,谢谢。 – panterasBox

相关问题