我最近做了很多Rcpp编码,偶然发现了让我困惑的事情。我的印象是,任何给定的功能都会创建其副本的副本。调用时的特定参数,然后一旦函数完成就会销毁这些变量。但是,我发现当我使用的List
类型似乎并非如此。在某些情况下,我可能需要修改不同功能中的列表元素,但希望列表位于“更高”的列表中。范围保持不变。这是一个非常简单的例子来说明问题:
TEST.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)));
}
test.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
如您所见,列表在函数上方的范围内进行了修改。我在这里错过了什么吗?
答案 0 :(得分:2)
是的,你错过了SEXP通过指针。
这是非常详细的文档,我们通常将我们的类型称为“浅代理对象”。