====== 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 + +'' ou ''Fortran'')
- 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 $(\phi, \kappa)$ e é dada pela seguinte expressão:\\
$\rho(u) = \{2^{\kappa-1} \Gamma(\kappa)\}^{-1} (u/\phi)^\kappa K_\kappa(u/\phi).$\\
No arquivo {{:cursos:rlavras:clavras01.c|}} encontra-se um código ''C'' para calcular valores de uma versão padronizada desta função onde $\phi=1$.\\
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 {{:cursos:rlavras: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")