使用辅助函数

时间:2015-10-06 16:43:56

标签: r fortran wrapper

我有一个两部分的问题,可能会改变首选习惯,以及我是否会不必要地使问题复杂化。我一直在使用.C并且学会了。呼叫来自R的重担。我想与.Fortran进行比较,所以我一直在学习它。因此,我的问题可能是由于我有限的Fortran知识。

在R中实现了几个我希望转换为Fortran的函数,它们彼此相关。我没有弄清问题的细节,而是创造了一个不切实际的例子,但这是一个很好的例子。

我有两个函数和两个相关的子程序来查找幅度和平方幅度,它们构成了整个文件:

! Actual functions
  real function sumofsquaresfun (x,y)
    implicit none
    real :: x,y
    sumofsquaresfun=x*x+y*y
  end function sumofsquaresfun


  real function magnitudefun(x,y)
    implicit none
    real :: x,y,tmp
    tmp=sumofsquaresfun(x,y)
    magnitudefun=sqrt(tmp)
  end function magnitudefun

! Wrappers for R accessibility since R requires subroutines
  subroutine sumofsquares(x,y,answer)
    implicit none
    real :: x,y
    real answer
    answer=sumofsquaresfun(x,y)
  end subroutine sumofsquares

  subroutine magnitude(x,y,answer)
    implicit none
    real :: x,y
    real answer
    answer=magnitudefun(x,y)
  end subroutine magnitude

假设当我在R中时两个子程序都很有用,所以将两者分开是很重要的。

当我尝试使用

进行编译时
R CMD SHLIB fortrancode.f95

我有几个错误有两种类型的错误:

Error: Return type mismatch of function 'sumofsquaresfun' at (1) (UNKNOWN/REAL(4))

Error: Function 'sumofsquaresfun' at (1) has no IMPLICIT type

我的问题按重要性顺序排列:

  1. 即使可行,这是解决此类问题的首选方法吗?我应该使用模块吗?我已经看过这个讨论(using a Fortran module in R?)以及相同OP的相关讨论,但不知道涉及模块是否必要/最佳。
  2. 如果我想做的是正确的方法,是什么导致这些令人尴尬的错误?
  3. 我喜欢使用函数,因为这是他们的意思,但是我是否因为创建子例程包装器而过于纯粹?是不是更好的风格去除它们所以我只有两个子程序?
  4. 非常感谢!

1 个答案:

答案 0 :(得分:1)

这更像是Fortran问题,而不是R问题。 您尚未在子例程中声明函数。 这样做,它应该编译。

! Actual functions
 real function sumofsquaresfun (x,y)
   implicit none
   real :: x,y
 sumofsquaresfun=x*x+y*y
 end function sumofsquaresfun


real function magnitudefun(x,y)
  implicit none
  real :: x,y,tmp
  real sumofsquaresfun
  tmp=sumofsquaresfun(x,y)
  magnitudefun=sqrt(tmp)
end function magnitudefun

! Wrappers for R accessibility since R requires subroutines
subroutine sumofsquares(x,y,answer)
  implicit none
  real :: x,y
  real answer
  real sumofsquaresfun
  answer=sumofsquaresfun(x,y)
end subroutine sumofsquares

subroutine magnitude(x,y,answer)
  implicit none
  real :: x,y
  real answer
  real magnitudefun
  answer=magnitudefun(x,y)
end subroutine magnitude

警告:您正在使用real,但不要忘记R使用双精度。 real是单精度。您应该使用real*8Fortran95等效的内容。