gpt4 book ai didi

c - R 将函数 Realoc 与 .C 接口(interface)一起使用

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

我正在测试使用 .C 接口(interface)从 R 调用 C 函数。测试包括将一个数字 vector 传递给没有条目的 C 函数,动态分配 n 个位置,进行归因并将 vector 返回给 R。

我正在使用 R.h 的 Calloc。函数原型(prototype)为

type* Calloc(size_t n, type)

如编写 R 扩展中所述。

问题是我没有得到具有 R 中分配位置的新 vector 。该 vector 仍然没有条目。

R中的代码

fooR <- function(x) {
if (!is.numeric(x))
stop("argument x must be numeric")
out <- .C("foo",
x=as.double(x))
return(out$x)
}

x <- numeric()

result <- fooR(x)

C中的函数

#include <R.h>

void foo(double *x)
{
int i, n;

n = 4;
x = Calloc(n, double);

for (i = 0; i < n; i++) {
x[i] = i;
printf("%f\n", x[i]); //just to check
}
}

问题是:.C 接口(interface)可以处理这样的内存分配吗?

最佳答案

是的,您可以那样使用内存管理,但前提是您使用 .Call() 接口(interface)而不是 .C() 接口(interface)。

参见 Memory Allocation 的“编写 R 扩展”手册以及Interface Functions .

还有其他书籍和一些示例。我更喜欢 C++ 而不是 C,并且使用 Rcpp 我们可以隐藏所有机制:

 R> cppFunction('IntegerVector makeVec(int n) { return IntegerVector(n); }')
R> makeVec(2)
[1] 0 0
R> makeVec(4)
[1] 0 0 0 0
R>

这在幕后同时使用了 .Call() 和 R 的内存分配,这是一个快速的小证明,“是的,你可以”实际上动态创建了一个 vector 。

关于c - R 将函数 Realoc 与 .C 接口(interface)一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970759/

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