gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:11 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com