gpt4 book ai didi

c++ - 在 Rcpp 中,为什么我不能将一个子集 vector 分配给另一个子集 vector

转载 作者:行者123 更新时间:2023-11-30 02:37:08 25 4
gpt4 key购买 nike

我目前正在将一些 R 代码移植到 Rcpp 中以提高速度(到目前为止已经成功),但我试图理解为什么 Rcpp 在子集化时不允许某些类型的赋值。

例如,在 R 中,如果我有三个 vector 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分配给另一个 vector ,然后将该 vector 分配给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 Gallery article关于索引/子集。

我过去用过 RcppArmadillo,有 also an Rcpp Gallery post除了 normal (and excellent) Armadillo documentation .

我也不会太担心将所有内容都放在一行中。编译器非常擅长删除临时文件。相反,我尝试编写我仍然可以在一周内阅读的代码。

关于c++ - 在 Rcpp 中,为什么我不能将一个子集 vector 分配给另一个子集 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31992883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com