R:使用带有.Call和C / C ++包装器的Fortran子例程代替.Fortran的优点?

我有一个R包,它使用大量的Fortran子程序来进行递归线性代数计算的嵌套循环(严重依赖于BLAS和LAPACK例程)。 作为Fortran的接口,我使用.Fortran函数。 我刚刚阅读了Jonathan Callahan关于在C / C ++编写的子程序中使用.Call而不是.C 的博客文章 ,它让我觉得在使用Fortran子程序时,通过写一个简单的方法也可以更好地使用.Call接口C中的包装器然后调用Fortran子例程?

如上所述,我的Fortran代码非常简单,因为我只使用double或integer类型的多维数组。 但是我已经知道我必须在R端编写相当多的检查以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的维度已更改等。

子程序写为F90 / 95。

如果您正在使用大型数据集,则可能会有一个优势。 .Call可以快得多,因为每次调用函数时都不会复制数据。 对于这个问题中描述的情况,将没有这样的优势,因为R 2.15.1发行说明了状态

.C()和.Fortran()执行较少的复制:在调用之前不复制原始,逻辑,整数,实数或复数向量以及未命名的参数,并且在调用之后不复制(已命名或未命名)。 不再复制列表(它们应该在C代码中以只读方式使用)。

切换到.Call意味着您放弃.Fortran界面的便利性。 您将SEXP传递到C代码中,使用(可怕的,未记录良好的)R API对数据进行任何检查/操作,然后从C调用Fortran函数。其他任何使用您的代码的人都必须了解R API和C / Fortran互操作。