我目前正在将一些R代码移植到Rcpp中以提高速度(到目前为止已成功),但我试图理解为什么Rcpp不允许某些类型的分配它涉及子集化。
例如,在R中,如果我有三个向量A,B,C,并且如果对于C的某些条件,我想要用B的值填充A,那么我可以写:
A[C < 3] = B[C< 3]
但是当我在Rcpp中尝试类似的东西时,我收到了一个错误。
Rccp似乎乐意分配以下内容:
A[C < 3] = X
...和...
Y = B[C< 3]
......但不是......
A[C < 3] = B[C< 3]
因此我首先将RHS分配给另一个向量,然后将该向量分配给LHS,它工作正常!?
以下是一些有效的示例代码:
cppFunction("
NumericVector valuesOverThree(NumericVector b){
NumericVector a(b.size());
NumericVector temp = b[b > 3];
a[b > 3] = temp;
return a;
}
")
valuesOverThree(1:6)
# returns: [0, 0, 0, 4, 5, 6]
这里有一些错误:
cppFunction("
NumericVector valuesOverThree(NumericVector b){
NumericVector a(b.size());
a[b > 3] = b[b > 3];
return a;
}
")
valuesOverThree(1:6)
# returns: error message
这有什么理由,或者无论如何我可以在一条线上完成这项工作吗?
如图所示,有一种解决方法,但如果我能在一行上写下所有内容会更好。
非常感谢
答案 0 :(得分:2)
我们在索引/子集上有Rcpp Gallery article。
我过去使用过RcppArmadillo,除了also an Rcpp Gallery post之外还有normal (and excellent) Armadillo documentation。
我也不会太担心将所有内容都放在一行上。编译器非常擅长删除临时工。相反,我尝试编写一周内仍然可以阅读的代码。
答案 1 :(得分:0)
只是一个简单的余数。
你可以用最新的Rcpp做到你想要的。
> cppFunction("
+ NumericVector valuesOverThree(NumericVector b){
+ NumericVector a(b.size());
+
+ a[b > 3] = b[b > 3];
+ return a;
+ }
+ ")
> valuesOverThree(1:6)
[1] 0 0 0 4 5 6
>