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

标签 c r rcpp

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

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

最佳答案

我建议您确实使用 .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() 接口(interface)中,您只能返回原子 C 类型,例如 *int*double 并且您 无法在 C 级别分配空间,因为当您实际上可以返回 SEXP 对象时,您只能“标记”SEXP 对象以供 R 管理 - 并且仅.Call() 可以。

关于c - 从 R 中的 .C 调用返回输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753304/

相关文章:

r - Rcpp中bool向量的子集向量

c - 如何找到数字1到n的第n位数字?

r - 使用 cat 从列表中插入一个空白行写入文件

r - 在 R studio 中安装 factoextra 包

递归地将函数应用于列表元素

c++ - 为多个 session 保留 XPtr

丙 |以计数器命名的结构

c - 在 C 中,文字字符串地址是否总是大于任何分配的字符串地址?

c# - Any CPU dependent on C++/CLI dependent on native C dll (any cpu for c++/cli)

c++ - Rcpp:无法返回在循环中创建的对象