Dando continuidade ao post de Introdução ao RCpp - Parte 1. Aqui eu mostrarei como os objetos do Rcpp se relacionam com os objetos em R. Os principais objetos do Rcpp são:
- NumericVector - Objeto representando um vetor numérico no R.
- CharacterVector - Objeto representando um vetor caracter no R.
- NumericMatrix - Objeto representando uma matriz numérica no R.
- CharacterMatrix - Objeto representando uma matriz caracter no R.
- LogicalVector - Objeto representando um vetor lógico no R.
- IntegerVector - Objeto representando um vetor inteiro no R.
- LogicalMatrix - Objeto representando uma matriz lógica no R.
- IntegerMatrix - Objeto representando uma matriz inteira no R.
- List - Objeto representando uma lista no R.
Aqui trabalharemos com exemplos de vetores e nos próximos posts o uso de matrizes e listas. Suponha que temos um vetor de retornos e um vetor com os nomes dos ativos representando esses vetores, algo como:
1 2 3 4 5 6 7 8 9 10 | #Invoca a biblioteca RCpp library (Rcpp) #Define o endereço do arquivo Cpp setwd ( "C:\\Blog\\Source" ) #Define a semente para simulação dos dados set.seed (19393) #Gera um vetor numérico de retornos: ret<- rnorm (1000, 0,0.1) #Gera um vetor caracter de nomes: nomes<- replicate (1000, paste ( sample ( LETTERS , 5, replace= TRUE ), collapse= "" )) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //Exemplo de função para obter os k menores valores. // [[Rcpp::export]] NumericVector kMenores( int k, NumericVector ret, CharacterVector nomes) { //Cria um vetor numérico de tamanho k NumericVector vetMenoresRetornos(k); //Cria um vetor caracter de tamanho k CharacterVector vetMenoresNomes(k); //Faz o loop para achar os k menores for ( int i = 0; i < ret.size(); i++){ //Verifica qual menor é: int iMenor = qualMenor(ret[i],vetMenoresRetornos); if (iMenor>-1){ vetMenoresRetornos[iMenor]=ret[i]; } } return vetMenoresRetornos; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <rcpp.h> using namespace Rcpp; //Função para dizer qual posição esse menor é: int qualMenor( double valor,NumericVector vetMenoresRetornos){ //Inicializa a variável int menor=-1; //Procura qual o menor: for ( int i=0;i< vetMenoresRetornos.size();i++){ if (valor<=vetMenoresRetornos[i]) return i; } return (menor); } </rcpp.h> |
1 2 3 4 5 6 7 8 9 10 | #Invoca a biblioteca RCpp library (Rcpp) #Define o endereço do arquivo Cpp setwd ( "C:\\Blog\\Source" ) #Compila o código em C++ sourceCpp ( 'Teste.cpp' ) #Inova a função compilada teste<- kMenores (5,ret,nomes) #Confere com a função do R head ( sort (teste),5) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //Exemplo de função para obter os k menores valores. // [[Rcpp::export]] NumericVector kMenores( int k, NumericVector ret, CharacterVector nomes) { //Cria um vetor numérico de tamanho k NumericVector vetMenoresRetornos(k); //Cria um vetor caracter de tamanho k CharacterVector vetMenoresNomes(k); //Faz o loop para achar os k menores for ( int i = 0; i < ret.size(); i++){ //Verifica qual menor é: int iMenor = qualMenor(ret[i],vetMenoresRetornos); if (iMenor>-1){ //Guarda os retornos mínimos vetMenoresRetornos[iMenor]=ret[i]; //Guarda os nomes das firmas vetMenoresNomes[iMenor]=nomes[i]; } } //Antes de retornar os resultados imprimir no console o nome for ( int j=0;j < k;j++){ std::cout << "Firma: " << vetMenoresNomes[j] << " Retorno: " << vetMenoresRetornos[j] << std::endl; } return vetMenoresRetornos; } |
- http://adv-r.had.co.nz/Rcpp.html
- http://gallery.rcpp.org/articles/r-function-from-c++/
- http://pages.stat.wisc.edu/~gvludwig/Rcpp/