Rcpp参数范围向上传播?

时间:2015-01-12 14:46:53

标签: c++ r rcpp

我最近做了很多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

如您所见,列表在函数上方的范围内进行了修改。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:2)

是的,你错过了SEXP通过指针。

这是非常详细的文档,我们通常将我们的类型称为“浅代理对象”。