如何从R调用C函数?
如何使用R数据从R级使用C编写的某些函数。 例如。 使用如下function:
double* addOneToVector(int n, const double* vector) { double* ans = malloc(sizeof(double)*n); for (int i = 0; i < n; ++i) ans[i] = vector[i] + 1 return ans; }
在上下文中:
x = 1:3 x = addOneToVector(x) x # 2, 3, 4
我先搜索了stackoverflow,但我注意到这里没有答案。
一般的想法是(Linux的命令,但在其他操作系统下相同的想法):
-
创建只接受基本类型指针并通过副作用执行所有操作的函数(返回void)。 例如:
void addOneToVector(int* n, double* vector) { for (int i = 0; i < *n; ++i) vector[i] += 1.0; }
-
将文件C源编译为动态库,可以使用R快捷方式执行此操作:
$ R CMD SHLIB lib.c
-
从R加载动态库:
dyn.load("foo.so")
-
使用
.C
R函数调用C函数,IE:x = 1:3 ret_val = .C("addOneToVector", n=length(x), vector=as.double(x))
它返回一个列表,您可以在调用函数后从中获取输入值,例如。
ret_val$x # 2, 3, 4
您现在可以将其包装起来,以便能够更轻松地使用它。
这里有一个很好的页面描述了整个过程的更多细节(也包括Fortran):