在 Rcpp 中,为什么我不能将子集向量分配给另一个子集向量
In Rcpp, why can't I assign a subsetted vector to another subsetted vector
我目前正在将一些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
>
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 如何获得比较两个向量对的子集
- 在 Rcpp-Function 中使用布尔向量的子集(Rcpp 初学者的问题..)
- C 从向量的子集返回一个随机值
- 如何在满足谓词的向量中获得唯一PTR的子集
- 向量的子集/C++/STL
- 通过单个向量进行迭代并删除作为其他元素子集的元素
- 将函数应用于向量子集的最佳方法是什么
- 确定一个向量是否是另一个向量的子集的有效方法
- 对定义顺序的向量的子集进行高效排序
- 如何将向量拆分为子集
- 子集的向量
- 赋值给向量的跨步子集
- C++:读取数据集并检查向量是否<Class>是向量的<Class>子集
- 从向量生成元素的子集(无嵌套循环)
- C++ 无效的向量 T 子集
- 向量,包含指向同一内存的另一个向量的部分子集
- 如何从给定的向量中检测所有可能的子集
- 将向量的子集<uint8_t>转换为整数
- 计数在向量子集中的出现次数