2016-05-19 4 views
2

У меня есть R :: NumericVector, и мне было интересно, можно ли преобразовать его в std :: vector, не используя цикл в C++.Convert R :: vector to std :: vector

void someFunction(NumericMatrix mtx){ 
    NumericVector rVec = mtx.row(0); 
    std::vector<int> sVec; 
    sVec = rVec; //<-- I wanna do something like this 
} 

ответ

5

Да, смотри, например, раздел 3 Введение в Rcpp виньетка около as<>(). Это в значительной степени в всякий раз, когда-либо написанное про Rcpp и трудно пропустить.

Приведенный ниже пример (с ручным отступом, код - только одна длинная линия).

R> cppFunction("std::vector<double> foo(NumericMatrix M) { 
     NumericVector a = M.row(0); 
     std::vector<double> b = as<std::vector<double> >(a); 
     return b; 
    }") 
R> foo(matrix(1:9, 3, 3)) 
[1] 1 4 7 
R> 
1

Несомненно, просто выделите std::vector и заполните его.

test.cpp

#include <Rcpp.h> 

// [[Rcpp::export]] 
void someFunction(Rcpp::NumericMatrix mat){ 

    Rcpp::NumericVector vec = mat.row(0); 

    std::vector<double> X(vec.begin(),vec.end()); 
    for (unsigned int i = 0; i<X.size(); i++) { 
    std::cout << "X[" << i << "] = " << X.at(i) << std::endl; 
    } 
} 

test.r

library(Rcpp) 

sourceCpp('test.cpp') 

mat <- matrix(rnorm(16), 4, 4) 

someFunction(mat) 

Вы также можете просто использовать функцию as

std::vector<double> X = Rcpp::as<std::vector<double> >(vec);