Tabela de conteúdos

Interface do R com códigos compilados

Interface do R com códigos compilados

Nas instruções a seguir os comandos precedidos de $ devem ser digidados na linha de comando do Linux (ou análogo em outro sistema operacional), e os precedidos por > devem ser digitados no R. Os exemplo assumem que todos os arquivos estão no mesmo diretório (pasta) da área de trabalho da sessão do R.

Códigos escritos e compilados em linguagens C, C + + ou Fortran podem ser chamados de dentro do R conforme ilustramos nos exemplos a seguir. Os passos básicos para tal procedimento são:

  1. Escrever o código na linguagem desejada (C, C + + ou Fortran)
  2. Compilar o código como o comando do linux (no Windows deve-se usar um comando análogo)
    $ R CMD SHLIB
  3. Carregar o código compilado no R com o comando
    > dyn.load()
  4. Usar a(s) função(ões) do código compilado com os comandos .C(), .Call() ou .Fortran().

Exemplo 1

Considere escrever uma função em C para calcular valores da função de correlação de Matèrn. Esta função tem como argumento u e parâmetros Graph e é dada pela seguinte expressão:
Graph
No arquivo clavras01.c encontra-se um código C para calcular valores de uma versão padronizada desta função onde Graph.
O código C é compilado com:

$ R CMD SHLIB clavras01.c
Este comando vai gerar um arquivo (biblioteca compartilhada) clavras01.so (.so no linux ou .dll no windows) que deve ser carregado na sessão do R com:
> dyn.load("clavras01.so")
. Com isto a rotina cormatern definida no código C pode ser chamada na sessão do R como no exemplo a seguir:
> .C("cormatern", as.integer(10), as.double(1:10), as.double(1.5), res=as.double(rep(0,10)))$res

Complementarmente, pode-se definir uma função R que seja um wrapper para facilitar a chamada da rotina C

"matern" <- function(u, kappa){
  out <- .C("cormatern", as.integer(length(u)), as.double(u),
            as.double(kappa), res = as.double(rep(0,length(u))))$res
  return(out)
}
 
matern(1:10, kappa=1.5)

Exemplo 2

Considere agora uma extensão do exemplo anterior onde temos mais de um arquivo de código. Além do arquivo com código C do exemplo anterior considere também o arquivo clavras02.c onde mais duas rotinas são definidas. Os dois arquivos são compilados gerando um único arquivo de biblioteca compartilhada com o comando:

$ R CMD SHLIB clavras01.c clavras01.c -o clavras.so
Desta forma as três rotinas em C ficam disponíveis no R após carregar a biblioteca compatilhada com
> dyn.load("clavras.so")