根据 http://gallery.rcpp.org/articles/r-function-from-c++ Rcpp允许用户从C ++调用R函数。在那儿 在Fortran中类似的东西,以便人们可以调用R函数 Fortran代码?
答案 0 :(得分:3)
我相信你应该看看RFortran? AFAIK它是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
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
答案 1 :(得分:1)
一般解决方案是将数据写入Fortran程序中的文件,调用EXECUTE_COMMAND_LINE
(标准Fortran 2003)或类似SYSTEM
(常见扩展名)以调用写入的R脚本将其结果发送到文件,然后从Fortran程序中读取这些结果。
由于R是免费软件并且是用R,C和Fortran编写的,因此可以将R代码转换为Fortran(都是数组语言)或直接从Fortran程序中调用C或Fortran代码。
否则,调查它最好从R调用Fortran(或C),因为您将找到有关这种方法的更多信息。这样做的系统定义很好。可能你可以反过来做,但有些东西需要初始化才能使R工作。