在 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

这样做有什么原因吗,或者我可以在一行上完成这个工作?

如图所示,有一个解决方法,但是如果我能把所有内容都写在一行上就更好了。

多谢

我们有一篇关于索引/子集的Rcpp画廊文章。

我过去使用过RcppArmadillo,除了正常的(和优秀的)Armadillo文档之外,还有一个Rcpp Gallery帖子。

我也不会太担心把所有东西放在一行上。编译器非常擅长删除临时项。相反,我试着写代码,我仍然可以阅读一个星期。

只是一个简单的余数。

你可以用最新的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
> 

最新更新