Rcpp:将两个 NumericVectors 相乘,同时对其中一个进行子集化

Rcpp: Multiply two NumericVectors while subsetting one of them

我有两个 NumericVectors AB。预先对向量 B 进行子集化时,以下乘法工作正常:

NumericVector B_sub  = B[A - 1];
NumericVector res    = A * B_sub;

当我尝试做的时候

NumericVector res = A * B[A - 1];

它产生错误

invalid operands to binary expression ('NumericVector' (aka 'Vector<14>') and 'SubsetProxy<14, PreserveStorage, 14, true, Rcpp::sugar::Minus_Vector_Primitive<14, true, Rcpp::Vector<14, PreserveStorage> > >')

我想这是 C++ 中的常见错误类型。我是一名与 R 和 python 有关的经济学学生,但 C++ 对我来说是一个新世界。

那么为什么使用 Rcpp 语法糖这个操作无效呢?有没有一种方法可以使用类型转换或类似的东西?


这是一个可复制的 myFun.cpp 文件:

#include <Rcpp.h>

using namespace std;
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector myFun(NumericVector B) {
  NumericVector A      = wrap(seq_len(B.size()));
  NumericVector B_sub  = B[A - 1];
  NumericVector res    = A * B_sub;
  // NumericVector res = A * B[A - 1];
  return res;
}

R-Code 使用 myFun:

library(Rcpp)
sourceCpp("myFun.cpp")
myFun(1:10)

您可以使用 as<NumericVector>()。创建以下 "myFun.cpp":

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
NumericVector myFun(NumericVector B) {
    NumericVector A   = wrap(seq_len(B.size()));
    NumericVector res = A * as<NumericVector>(B[A - 1]);
    return res;
}

/*** R
myFun(1:10)
*/

然后来源并查看结果:

library(Rcpp)
sourceCpp("myFun.cpp")

> myFun(1:10)
 [1]   1   4   9  16  25  36  49  64  81 100