在Rcpp中,为什么我不能将子集化矢量分配给另一个子集矢量

时间:2015-08-13 15:45:01

标签: c++ r rcpp

我目前正在将一些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

这有什么理由,或者无论如何我可以在一条线上完成这项工作吗?

如图所示,有一种解决方法,但如果我能在一行上写下所有内容会更好。

非常感谢

2 个答案:

答案 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
>