我想在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))
感谢您的帮助! 我用
生成.soR CMD SHLIB test_inside_program.f90
答案 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