首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >R:如何让.C调用更新输出变量?

R:如何让.C调用更新输出变量?
EN

Stack Overflow用户
提问于 2018-07-31 08:33:43
回答 1查看 57关注 0票数 0

我正在尝试编写一个C代码以在R中使用,但发现.C函数调用不会更新输出变量。真正的C代码很复杂,但这里有一个简单的示例来展示其行为:

代码语言:javascript
复制
void doubleMe(const int *input, int *output) {
    output[0] = input[0] * 2;
}

将上述C函数保存到文件doubleMe.c中。在Linux下,编译创建doubleMe.so文件:

代码语言:javascript
复制
R CMD SHLIB doubleMe.c

在R中,如果我执行以下操作:

代码语言:javascript
复制
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:

代码语言:javascript
复制
output
[1] 0

如果我真的这样做了

代码语言:javascript
复制
output = .C("doubleMe", as.integer(input), as.integer(output))[[2]]

输出为4。这应该适用于示例。

但我的实际输入和输出是矩阵,我必须将输出重塑到正确的维度。有没有办法让.C直接调用更新输出?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-31 09:01:27

对于使用SEXP数据类型的.Call()接口,P代表指针,这是自动的:

代码语言:javascript
复制
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代码中完成相同的操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51603956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档