2016-05-19 1 views
2

J'ai un R :: NumericVector et je me demandais s'il était possible de le convertir en un vecteur std :: sans utiliser de boucle en C++.Convertir R :: vector en std :: vector

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

Répondre

5

Oui, voir par exemple l'article 3 de l'introduction CRPP vignette sur as<>(). C'est à peu près dans chaque intro jamais écrit sur Rcpp et difficile à manquer.

Exemple travaillé ci-dessous (avec indentation manuelle, le code est juste une longue ligne).

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

Bien sûr, il suffit d'allouer le std::vector et de le remplir.

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) 

Vous pouvez aussi utiliser la fonction as

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