在R中有效调用F95:使用.Fortran或.Call?

Ixx*_*xie 5 c dll fortran r

我正在编写一些R仿真代码,但想利用Fortran的快速线性代数库替换核心迭代循环。到目前为止,我主要关注的是使用.Fortran调用链接的F95子例程的明显选择。我认为我应该优化内存使用(我要传递非常大的数组)并进行设置,DUP=FALSE但是随后我阅读了手册中有关此方法及其在R 3.1.0中贬值和在R 3.2.0中禁用的危险。现在,手册建议您切换到.Call,但是此功能本来就不提供Fortran支持。

我的谷歌搜索产生了一个stackoverflow问题,该问题探讨了一种通过C代码链接Fortran子例程并使用调用它的方法.Call。在我看来,这可以像咒语或诅咒一样起作用。因此,我的问题是:

  1. 为了提高速度和增强鲁棒性,通过.Fortran和调用Fortran的风险和收益是.Call什么?
  2. 有没有更优雅/有效的方法.Call来调用Fortran子例程?
  3. 共有其他选择吗?

Kev*_*hey 3

以下是我对这种情况的看法:

.Call是通常首选的接口。它直接为您提供指向底层 R 数据对象 (a ) 的指针SEXP,因此所有内存管理都由您决定。如果需要,您可以尊重该NAMED字段并复制数据,也可以忽略它(如果您知道不会就地修改数据,或者出于某种其他原因愿意这样做)

.Fortran尝试自动从 RSEXP对象向 Fortran 子例程提供适当的数据类型;然而,它的使用通常不被鼓励(老实说,出于我并不完全清楚的原因)

从 C/C++ 例程调用编译的 Fortran 代码应该会有些运气。给定一个名为 的 Fortran 子例程fortran_subroutine,您应该能够在 C / C++ 代码中提供前向声明,例如(注意:您需要extern "C"C++ 代码的前导):

void fortran_subroutine_(<args>);
Run Code Online (Sandbox Code Playgroud)

请注意函数名称上的尾随下划线——这就是 Fortran 编译器(我熟悉的,例如gfortran)默认情况下“mangle”符号名称的方式,因此可用的符号将具有该尾随下划线。

此外,您需要确保<args>您选择的映射从相应的 C 类型到相应的 Fortran 类型。幸运的是,R-exts提供了这样一个表。

最后,RR CMD build将自动促进 R 包的编译+链接过程。因为我显然是一个贪图惩罚的人,所以我制作了一个示例包,它应该为您提供足够的信息,以了解绑定如何在那里工作。