Rcpp:动态更新列表

时间:2014-03-09 20:53:53

标签: r rcpp

我正在寻找动态更新列表的解决方案。

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List Test(){
List L;
List L1=List::create(12,45,22,44);
L=Language("c",L,L1).eval();//update, add L1's elements on L's back.
return L;
}

由于“List L”,上述内容无效使L成为空列表。

但是,如果我写了一个额外的功能:

List connectlist(List& a, List& b){
return Language("c",a,b).eval();
}

并替换“L =语言(”c“,L,L1).eval();”使用“connectlist(L,L1);”,它将起作用。

谁能告诉我原因?或者有没有更简单的方法来动态更新Rcpp中的列表?

PS:我做了一些时间测试,他们表示调用“c”函数组合2个列表比通过复制2个列表中的元素创建新列表更快。

谢谢!

2 个答案:

答案 0 :(得分:3)

你犯了与上一个问题相同的错误。

C ++是C ++。 R是R.而且他们是不同的。

仅仅因为你知道R中的c()函数/运算符并不意味着这是在C ++中的方法。您应该阅读一些C ++或编程文本 - 有相同的数据结构来增长对象和追加。我们中的许多人都喜欢STL,Rcpp可以帮助您轻松获取R数据。

编辑于2014-03-12 感谢Kevin的提交,现在这也适用于发布候选版本Rcpp 0.11.1,该版本应在几天内打到CRAN(你可以获得现在来自GitHub。)

R> library(Rcpp)
R> packageDescription("Rcpp")$Version
[1] "0.11.1"                             # as on GitHub, to be on CRAN soon
R> sourceCpp("/tmp/listconcat.cpp")
R> Test()
x = [[1]]
[1] 12

[[2]]
[1] 45

[[3]]
[1] 22

[[4]]
[1] 44


L = [[1]]
[1] 12

[[2]]
[1] 45

[[3]]
[1] 22

[[4]]
[1] 44


R> 

通过调用R来连接两个C ++列表仍然是错误的编程习惯,但是如果 有人真的坚持这样做,现在他们可以做到。

答案 1 :(得分:3)

似乎Rcpp的List::operator=被打破了。使用此代码:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void Test(){
  List L;
  List L1=List::create(12,45,22,44);
  SEXP x=Language("c",L,L1).eval();//update, add L1's elements on L's back.
  Rprintf( "x = " ) ; Rf_PrintValue(x) ; Rprintf( "\n") ;

  L = x;
  Rprintf( "L = " ) ; Rf_PrintValue(L) ; Rprintf( "\n") ;

}

我用Rcpp的当前devel版本得到了这个。

> Test()
x = [[1]]
[1] 12

[[2]]
[1] 45

[[3]]
[1] 22

[[4]]
[1] 44


L = list()

这是错误的。但是,我用Rcpp11得到了正确的答案:

> Test()
x = [[1]]
[1] 12

[[2]]
[1] 45

[[3]]
[1] 22

[[4]]
[1] 44


L = [[1]]
[1] 12

[[2]]
[1] 45

[[3]]
[1] 22

[[4]]
[1] 44