在 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/