我正在尝试编写一个C代码以在R中使用,但发现.C函数调用不会更新输出变量。真正的C代码很复杂,但这里有一个简单的示例来展示其行为:
void doubleMe(const int *input, int *output) {
output[0] = input[0] * 2;
}
将上述C函数保存到文件doubleMe.c中。在Linux下,编译创建doubleMe.so文件:
R CMD SHLIB doubleMe.c
在R中,如果我执行以下操作:
dyn.load("doubleMe.so") # load it
input = 2
output = 0
.C("doubleMe", as.integer(input), as.integer(output)) # expect output=4
[[1]]
[1] 2
[[2]]
[1] 4
屏幕输出指示输入加倍,但R中的输出仍为0:
output
[1] 0
如果我真的这样做了
output = .C("doubleMe", as.integer(input), as.integer(output))[[2]]
输出为4。这应该适用于示例。
但我的实际输入和输出是矩阵,我必须将输出重塑到正确的维度。有没有办法让.C直接调用更新输出?
发布于 2018-07-31 09:01:27
对于使用SEXP
数据类型的.Call()
接口,P
代表指针,这是自动的:
R> Rcpp::cppFunction("void doubleMe(NumericVector x) { x = 2*x; } ")
R> x <- 1 # set to one
R> doubleMe(x) # call function we just wrote
R> x # check ...
[1] 2 # and it has doubled as a side-effect
R>
我在这里使用Rcpp,因为它允许我在一行中完成此操作,如果您愿意,您可以在几行C代码中完成相同的操作。
https://stackoverflow.com/questions/51603956
复制相似问题