Frequentemente é necessário inicializar um NumericVector com algum valor de constante fixo, nesse caso podemos usar a função fill(.):
#includeusing namespace Rcpp; // Função para repetir o valor no vetor // [[Rcpp::export]] NumericVector inicializaVetor(double valor, int tamanho) { NumericVector x(tamanho); x.fill(valor); return x; }
Após compilar o código, a invocação no R é quase imediata:
#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') inicializaVetor(2,5)
O pacote Rcpp tem muitas funcionalidades. Por meio do Rcpp podemos por exemplo, usar funções já implementadas no R, como:
// [[Rcpp::export]] NumericVector calculaCurtose(NumericVector x) { Rcpp::Environment funcoesPacote("package:e1071"); Rcpp::Function funcaoCurtose = funcoesPacote["kurtosis"]; return funcaoCurtose (x); }
Ou por exemplo, gerar números com a distribuição normal:
// [[Rcpp::export]] NumericVector geraNormal(){ Rcpp::Environment stats("package:stats"); Rcpp::Function rnorm = stats["rnorm"]; return rnorm(10, Rcpp::Named("sd", 100.0)); }
Comandos esses que após compilados são invocados na forma:
#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') #Executa as funções: x<-rnorm(1919) calculaCurtose(x) geraNormal()Entre os objetos mais flexíveis do Rcpp está o objeto GenericVector o qual funciona como uma lista permitindo a inserção de qualquer outro objeto em seus slots. Além do mais, é possível usar os seguintes métodos nesse objeto:
- push_back(x) - Insere o elemento x no final da lista.
- push_front(x) - Insere o elemento x no início da lista.
- insert(i, x) - Insere o elemento x na posição i.
- erase(i) - Apaga o elemento existente na posição i.
Todas essas funções são dinâmicas e não há a necessidade de criar uma nova lista para que os novos elementos sejam inseridos.