gpt4 book ai didi

c++ - Rcpp 参数范围向上传播?

转载 作者:太空狗 更新时间:2023-10-29 21:41:50 27 4
gpt4 key购买 nike

我最近一直在进行大量的 Rcpp 编码,并且偶然发现了一些让我感到困惑的事情。我的印象是,任何给定的函数在调用时都会创建其特定参数的拷贝,然后一旦函数完成,这些变量就会被销毁。但是,我发现当我使用 List 类型时,情况似乎并非如此。在某些情况下,我可能需要修改不同函数内的列表元素,但希望“更高”范围内的列表保持不变。这是一个非常简化的示例来演示该问题:

测试.cpp

//[[Rcpp::export]]
int list_length(List myList){

// some sort of modification that could be needed locally
for (int w=0; w < myList.size(); w++) {
myList[w] = 13;
}

// return whatever metric
return myList.size();
}

//' @export
//[[Rcpp::export]]
SEXP list_int(List myList){

// only want the int output from function
int out = list_length(myList);

return(List::create(myList,
wrap(out)));
}

测试.R

# create simple list
myList <- as.list(seq(4))

# call Rcpp function
list_int(myList)

# output
[[1]]
[[1]][[1]]
[1] 13

[[1]][[2]]
[1] 13

[[1]][[3]]
[1] 13

[[1]][[4]]
[1] 13


[[2]]
[1] 4

如您所见,列表在函数上方的范围内被修改。我在这里遗漏了什么吗?

最佳答案

是的,您错过了 SEXP 传递指针。

这有很好的记录,我们通常将我们的类型称为“浅层代理对象”。

关于c++ - Rcpp 参数范围向上传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27904645/

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