我想将Fortran代码集成到我的R包中。为了练习,我尝试将inline
与Fortran代码一起使用。我可以创建该函数,但是,当我尝试运行它时,出现段错误
library(inline)
src = "
integer i,j,k
do k = 1,prok
do j = 1,ncolv
do i = 1,nrowv
emis(i,k) = veh(i,j) * lkm(i) * ef(j)*pro(k)
end do
end do
end do
"
work <- cfunction(sig = signature(
nrowv="integer",ncolv = "integer",prok = "integer",veh="numeric",lkm = "numeric",ef = "numeric",pro = "numeric",emis = "numeric"),implicit = "none",dim = c("","","(nrowv,ncolv)","(nrowv)","(ncolv)","(prok)",ncolv,prok)"),src,language="F95",verbose = F)
work(nrowv = 3,ncolv = 2,prok = 3,veh = 1:6,lkm = 1:3,ef = 1:2,pro = 1:4,emis = as.numeric(1))
给出: 分段故障(核心已转储) 我添加了工作功能的图片,以查看子例程的情况。
print(work)
An object of class 'CFunc'
function (nrowv,prok,veh,lkm,ef,pro,emis)
.Primitive(".Fortran")(<pointer: 0x7ffac77db100>,nrowv = as.integer(nrowv),ncolv = as.integer(ncolv),prok = as.integer(prok),veh = as.double(veh),lkm = as.double(lkm),ef = as.double(ef),pro = as.double(pro),emis = as.double(emis))
<environment: 0x55ab99679e70>
code:
1:
2: SUBROUTINE file77f62087457e ( nrowv,emis )
3: IMPLICIT none
4: INTEGER nrowv
5: INTEGER ncolv
6: INTEGER prok
7: DOUBLE PRECISION veh(nrowv,ncolv)
8: DOUBLE PRECISION lkm(nrowv)
9: DOUBLE PRECISION ef(ncolv)
10: DOUBLE PRECISION pro(prok)
11: DOUBLE PRECISION emis(nrowv,prok)
12:
13: integer i,k
14: do k = 1,prok
15: do j = 1,ncolv
16: do i = 1,nrowv
17: emis(i,j) * lkm(i) * ef(j)*pro(k)
18: end do
19: end do
20: end do
21:
22: RETURN
23: END
24: