如何从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的命令,但在其他操作系统下相同的想法):

  1. 创建只接受基本类型指针并通过副作用执行所有操作的函数(返回void)。 例如:

     void addOneToVector(int* n, double* vector) { for (int i = 0; i < *n; ++i) vector[i] += 1.0; } 
  2. 将文件C源编译为动态库,可以使用R快捷方式执行此操作:

     $ R CMD SHLIB lib.c 
  3. 从R加载动态库:

     dyn.load("foo.so") 
  4. 使用.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):

http://users.stat.umn.edu/~geyer/rc/