2014-03-05 183 views
-4

在R,当我尝试下面的代码.Fortran()返回任何结果

.Fortran("add", x= as.double(2),y= as.double(3)) 

[R仅返回论点,但没有结果!

$x 
[1] 2 
$y 
[1] 3 

add是唯一的简单函数I写入Fortran源文件test.f90:

function add (x,y) result (f_result) 
real:: x,y,f_result 
f_result = x+y 
end function add 

和我使用:

gfortran -shared -o test.dll test.f90 

以获得加载到test.dll R通过

dyn.load("test.dll") 

在上述所有流程中,我没有收到任何错误或警告消息。所以我无法弄清楚问题出在哪里。我搜查了很多,但找不到解决方案。任何帮助?

顺便说一句,我用的windows7(X86),R3.0.2,GNU的Fortran(GCC)4.7.0

+2

出自[编写R扩展,第5.2节](http://cran.r-project.org/doc/manuals/R-exts.html#Interface-functions-_002eC-and-_002eFortran),“请注意,编译后的代码不应该返回任何东西,除非通过它的参数:C函数应该是void类型,FORTRAN子程序应该是子例程。“ –

+0

同时发布添加功能 – Peter

回答

2

写子程序,使用参数作为返回值:

subroutine add(x,y,z) 
    real*8 x,y,z 
    z=x+y 
    end 

编译如下:

$ R CMD SHLIB add.f 

> dyn.load("add.so") 
> .Fortran("add",as.double(1),as.double(2),as.double(-999)) 
[[1]] 
[1] 1 

[[2]] 
[1] 2 

[[3]] 
[1] 3 

你甚至都不需要命名的参数,但它可以帮助因为你可以再由名字得到返回值:

> .Fortran("add",as.double(1),as.double(2),ans=as.double(-999))$ans 
[1] 3 
>