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:
- Escrever o código na linguagem desejada (
C
,C + +
ouFortran
) - Compilar o código como o comando do linux (no Windows deve-se usar um comando análogo)
$ R CMD SHLIB
- Carregar o código compilado no R com o comando
> dyn.load()
- 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 <latex>$(\phi, \kappa)$</latex> e é dada pela seguinte expressão:
<latex>$\rho(u) = \{2^{\kappa-1} \Gamma(\kappa)\}^{-1} (u/\phi)^\kappa K_\kappa(u/\phi).$</latex>
No arquivo clavras01.c encontra-se um código C
para calcular valores de uma versão padronizada desta função onde <latex>$\phi=1$</latex>.
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")