SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

sábado, 15 de abril de 2017

Introdução ao RCpp - Parte 4.


Frequentemente é necessário inicializar um NumericVector com algum valor de constante fixo, nesse caso podemos usar a função fill(.):

#include 
using 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.

Nenhum comentário:

Postar um comentário