如何从Fortran中调用R函数?

11

你是否在寻找除下面答案所提供的之外的任何东西? - cdeterman
2个回答

3
我认为你应该看看RFortran。据我所知,这是R对象的唯一Fortran绑定,而且它是开源的。
编辑:
根据下面的评论,我不知道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

由于必须知道R、Rcpp和RInside的包含目录的位置,因此C++编译有点棘手。

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 

1
COM是微软的技术,因此您只能在Windows平台上使用它。尽管R存在于Linux和其他平台上,但由于没有COM接口,您将无法在这些平台上使用RFortran。 - IRTFM
1
COM非常丑陋,最好直接从Fortran接口Rcpp。 - Vladimir F Героям слава

1
一般的解决方案是从Fortran程序将数据写入文件,调用EXECUTE_COMMAND_LINE(标准Fortran 2003)或类似SYSTEM(常见扩展名)的命令来调用一个R脚本,该脚本将其结果写入文件,然后从Fortran程序中读取这些结果。
由于R是免费软件,并且是用R、C和Fortran编写的,因此可能可以将R代码转换为Fortran(两者都是数组语言),或者直接从Fortran程序中调用C或Fortran代码。
否则,研究是否更好地从R调用Fortran(或C),因为您将找到更多有关执行此方法的信息。执行此操作的系统已经定义得相当完善。也许可以反过来做,但某些内容需要初始化才能使R正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接