[R-br] Compilando e utilizando códigos em C no R

Gustavo Marcatti vgp.gustavo em yahoo.com.br
Domingo Setembro 25 22:10:01 BRT 2011


Pessoal esse email é para aqueles que tem dificuldades em compilar um código em C e utilizá-lo no R (principalmente usuários Windows).
Tem um pacote (inline) que facilita bastante esse processo e pode ser interessante até para usuários unix. Esse pacote compila o código gerando uma .dll (windows) temporária 
que depois é carregada no R. O código em C pode ser escrito no próprio script do R (normalmente eu deixo em um arquivo separado .r e quando quero utilizar a função utilizo o source(".r"), então o código é compilado/carregado e a função já fica pronta para uso. Depois de encerrar o R o dll é excluída do sistema. Segue um exemplo.
 
# Exemplo:
# Algoritmo que retorna o valor mínimo de um vetor
# 1º: utilizando o loop for do R
min2 <- function(vetor){
    n <- length(vetor)
    Min <- vetor[1]
    for(i in 1:(n-1)){
        if(Min > vetor[i+1]) Min <- vetor[i+1]
    }
    Min
}
# 2º: utilizando um codigo escrito em C
#install.packages("inline", dep = T)
require(inline)
#--- Compilando a função que encotra o menor valor em um vetor  ------------
#--- Só é necessário compilar uma vez --------------------------------------
    # Argumentos da função em C
    sigMin <- signature( vetor="double", n="integer", Min = "double")
    # Código propriamente dito
    codeMin <- "
      *Min = vetor[0];
          for (int i=0; i < *n - 1; i++) {
              if(*Min > vetor[i+1]) *Min = vetor[i+1];
    }"
    # Para compilar a função
    funcMin <- cfunction(sigMin, codeMin, convention=".C")
#--- Fim
 
# apenas para facilitar o uso da função
min3 <- function(vetor){
    n <- length(vetor)
    Min <- 0
    funcMin(vetor,n,Min)$Min
}
 
# Teste:
set.seed(1)
vec <- runif(1000000)
system.time(minimo1 <- min2(vec))
minimo1
system.time(minimo2 <- min3(vec))
minimo2
 
# Mais exemplos podem ser encotrados no pacote inline.
 
Gustavo Marcatti
Eng. Florestal- UFV
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20110925/82f6e6f3/attachment.html>


Mais detalhes sobre a lista de discussão R-br