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

时间:2018-01-08 17:26:46

标签: c++ r rcpp

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

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

当我尝试

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

它会产生错误

  

二进制表达式的无效操作数('NumericVector'(又名'Vector< 14>')和'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)

1 个答案:

答案 0 :(得分:1)

您可以使用18 。创建以下&#34; myFun.cpp&#34;:

as<NumericVector>()

然后来源并查看结果:

#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)
*/