【问题标题】:How to call R functions from Fortran?如何从 Fortran 调用 R 函数?
【发布时间】:2015-06-20 21:43:26
【问题描述】:

根据 http://gallery.rcpp.org/articles/r-function-from-c++ Rcpp 允许用户从 C++ 调用 R 函数。有没有 Fortran 中类似的东西,这样人们就可以调用 R 函数 Fortran 代码?

【问题讨论】:

  • 您是否正在寻找超出以下答案中提供的内容的内容?

标签: r fortran


【解决方案1】:

我相信你应该看看RFortran? AFAIK 它是 R 对象的唯一 Fortran 绑定,而且它是开源的。

编辑

根据下面的 cmets,我不知道 RFortran 仅适用于 Windows。因此,为了获得更便携的答案,让我们创建一个示例,在该示例中我将利用 RInside 这使得在 C++ 代码中嵌入 R 函数更简单。我也会使用iso_c_binding 与 C 接口。

testC.cpp

#include <iostream>
#include <RInside.h>                    

void helloR_(int argc, char *argv[], const char *msg);

extern "C" void helloR(int argc, char *argv[], const char *msg) {

    // create an embedded R instance
    RInside R(argc, argv);              

    // convert to string for RInside assignment
    std::string txt = std::string(msg);

    // C++ Notice
    std::cout << "This is C++, " << txt << std::endl;

    // Assign string to R object
    R.assign(txt, "txt");

    // eval the string, give R notice
    R.parseEvalQ("cat('This is R, ', txt, '\n')");
}

testF.f

  PROGRAM MAIN
    USE iso_c_binding
    IMPLICIT NONE
    INTEGER :: argc
    CHARACTER(len=32) :: arg
    CHARACTER(len=32) :: msg

    INTERFACE
      SUBROUTINE R_FUN(argc, arg, msg) bind(C, name="helloR")
        USE iso_c_binding
        INTEGER(kind=c_int), INTENT(IN) :: argc
        CHARACTER(kind=c_char), INTENT(IN) :: arg(*)
        CHARACTER(kind = C_CHAR), INTENT(IN) :: msg(*)
      END SUBROUTINE R_FUN
    END INTERFACE

    print *, "Fortran Calling RInside"
    CALL R_FUN (argc, arg, "Hello World"//C_NULL_CHAR)

  END PROGRAM

Fortran 编译很简单:

gfortran -c testF.f

C++ 编译有点棘手,因为您必须知道 R、Rcpp 和 RInside 的包含目录在哪里。

g++ testC.cpp -c -I/path/to/RInside/include -I/path/to/Rcpp/include -I/usr/share/R/include

然后您需要提供正确的库和lgfortran 标志的链接。

g++ -o fcr testF.o testC.o -L/usr/lib/R/lib -lR -L/path/to/RInside/lib/ -lRInside -L/path/to/Rcpp/libs/ -Wl,-rpath,/home/path/to/RInside/lib/ -lRInside -Wl,-rpath,/path/to/Rcpp/libs/ -lgfortran

现在我有一个小程序演示如何从 Fortran 访问 R 函数

./fcr
 Fortran Calling RInside
This is C++, Hello World
This is R,  Hello World 

【讨论】:

  • "COM 是一项 Microsoft 技术,因此您只能在 Windows 平台上使用它。即使 R 存在于 Linux 和其他平台上,您也无法在这些平台上使用 RFortran平台,因为 COM 接口不存在。"
  • COM 很丑,最好只连接 Fortran 的 Rcpp。
【解决方案2】:

一般的解决方案是将数据从 Fortran 程序写入文件,调用 EXECUTE_COMMAND_LINE(标准 Fortran 2003)或类似 SYSTEM(通用扩展名)的东西来调用 R 脚本,将其结果写入文件,然后从 Fortran 程序中读取这些结果。

由于 R 是免费软件并且是用 R、C 和 Fortran 编写的,因此可以将 R 代码翻译成 Fortran(两者都是数组语言)或直接从 Fortran 程序调用 C 或 Fortran 代码。

否则,最好从 R 中调用 Fortran(或 C),因为您会发现有关执行此方法的更多信息。这样做的系统非常明确。可能您可以反过来做,但是需要初始化一些东西才能使 R 工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多