从R中的.C调用返回输出

时间:2012-10-05 20:05:29

标签: c r rcpp

在R here.C函数的文档中,它表示C函数本身必须是返回类型void。我正在研究一些使用.C函数(而不是.Call或Rcpp)的继承代码,但我想写一个“返回”未知大小的向量的函数。如果我知道这个向量的大小,我可以在R中分配它并将指针传递给C,然后可以修改其内容。鉴于我不知道它的大小,在R中声明它的方法是什么?我想它会有这种形状,但我不知道细节:

output <- ?????
storage.mode(a) <- "integer"
tmp <- .C("myfunc",a,output)

1 个答案:

答案 0 :(得分:3)

我建议您使用.Call()代替.C() - 请参阅最近关于r-devel列表的讨论。我猜想你会发现几乎没有经验丰富的R开发人员建议将.C()用于新项目。

这是一个简单的例子。你绝不会被迫使用Rcpp,同样的代码也可以在普通的C API中编写,虽然不是那么紧凑:

R> fx <- rcpp(signature(sn="integer"), body='   // rcpp() is from inline 0.3.10
+    int size = as<int>(sn);
+    IntegerVector v(size); 
+    for (int i=0; i<size; i++) v[i] = i;
+    return(v); 
+ ') 
R> fx(3) 
[1] 0 1 2   
R> fx(7) 
[1] 0 1 2 3 4 5 6  
R>

在旧的.C()界面中,您只能返回*int*double等原子C类型,而无法在C级别分配空间只有SEXP对象可以“标记”SEXP对象以供R管理,并且只有.Call()可以。