我正在寻找动态更新列表的解决方案。
#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个列表中的元素创建新列表更快。谢谢!
答案 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