如何从R到Fortran子程序给出一个具有多个维度的数组?

时间:2013-09-13 07:04:22

标签: r variables fortran dimension

我想在R中使用fortran程序,但在运行R程序时出错。 fortran代码具有2维的REAL变量。 fortran的测试代码如下: test_inside_program.f90:

program testprogram

implicit none
interface
    SUBROUTINE testm(testvar, thelength)
        IMPLICIT NONE
        REAL, INTENT(IN), DIMENSION(:) :: testvar
        INTEGER, INTENT(IN) :: thelength
    END SUBROUTINE testm
end interface

REAL, DIMENSION(:),ALLOCATABLE :: testvar
INTEGER :: i
allocate(testvar(3))
DO i = 1,2
  testvar(i) = i
ENDDO
call testm(testvar, 3)
write(*,*) 'program finished'
end program testprogram




SUBROUTINE testm(testvar,thelength)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: thelength
    REAL, INTENT(IN), DIMENSION(:) :: testvar

    write(*,*) 'program cont. X'
    write(*,*)' THe testvar 1st variable is', testvar

END SUBROUTINE testm

我想从R调用子程序testm 当然我想保持尺寸。 因此我在R中生成了以下测试代码: test.r

dyn.load("test_inside_program.so")
is.loaded("testm")

dd <- c(5,2,3)
.Fortran("testm",as.single(dd),as.integer(3))

感谢您的帮助! 我用

生成.so
R CMD SHLIB test_inside_program.f90

2 个答案:

答案 0 :(得分:1)

你不能在这里声明一个假定的形状数组,因为R不知道如何传递这样一个数组(它不仅仅是一个指向数据的指针,它必须与维度结合在一起)。

这将有效:

subroutine testm(testvar,thelength)
   implicit none
   integer, intent(in) :: thelength
   real, intent(in), dimension(thelength) :: testvar

   write(*,*) 'program cont. x'
   write(*,*) 'length=', thelength
   write(*,*) 'testvar=', testvar
end subroutine testm

另外,根据您的需要,您可以考虑在程序中声明双精度数组并从R中“按原样”传递它们(它是默认的数字类型)。对于整数,你也可以在R中直接写3L,因此,对于单个和双,它是这样的:

.Fortran("testm", as.single(dd), 3L)
.Fortran("testm", dd, 3L)

答案 1 :(得分:0)

好的,问题解决了! fortran中的子程序:

SUBROUTINE testm(testvar, thelength)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: thelength
    REAL, INTENT(IN), DIMENSION(thelength) :: testvar
END SUBROUTINE testm

在R

dd <- c(5.5,2,3.3)
#length(dd)
print("call fortran routine")
.Fortran("testm",as.single(dd),as.integer(3))

我不知道为什么它之前没有用:o