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 e é dada pela seguinte expressão:
No arquivo clavras01.c encontra-se um código C
para calcular valores de uma versão padronizada desta função onde .
O código C
é compilado com:
$ R CMD SHLIB clavras01.cEste 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.soDesta forma as três rotinas em
C
ficam disponíveis no R após carregar a biblioteca compatilhada com > dyn.load("clavras.so")