[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