Não foi possível enviar o arquivo. Será algum problema com as permissões?
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
cursos:rlavras:compilado [2008/11/02 13:22] paulojus |
cursos:rlavras:compilado [2008/11/02 16:30] (atual) paulojus |
||
---|---|---|---|
Linha 1: | Linha 1: | ||
====== Interface do R com códigos compilados ====== | ====== Interface do R com códigos compilados ====== | ||
- | 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: | + | 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. |
- | - Escrever o código na linguagem desejada (''C'', ''C++'' ou ''Fortran'') | + | Os exemplo assumem que todos os arquivos estão no mesmo diretório (pasta) da área de trabalho da sessão do R. |
- | - Compilar o código como o comando (linux) <code bash>R CMD SHLIB</code> (No Windows deve-se usar o comando análogo). | + | |
- | - Carregar o código compilado no R com o comando <code R>dyn.load()</code> | + | 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: |
- | - Usar a(s) função(ões) do código compilado com os comandos <code R>.C()</code>, <code R>.Call()</code> ou <code R>.Fortran()</code>. | + | - 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) <code bash>$ R CMD SHLIB</code> | ||
+ | - Carregar o código compilado no R com o comando <code R>> dyn.load()</code> | ||
+ | - Usar a(s) função(ões) do código compilado com os comandos ''.C()'', ''.Call()'' ou ''.Fortran()''. | ||
==== Exemplo 1 ==== | ==== 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:\\ | 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> | + | <latex>$\rho(u) = \{2^{\kappa-1} \Gamma(\kappa)\}^{-1} (u/\phi)^\kappa K_\kappa(u/\phi).$</latex>\\ |
- | No arquivo {{:cursos:rlavras:clavras01.c|}} encontra-se um código ''C'' para calcular valores de uma versão padronizada desta função onde <latex>$\phi=1$</latex>. | + | No arquivo {{:cursos:rlavras: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:<code>$ R CMD SHLIB clavras01.c</code> | ||
+ | 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: <code R>> dyn.load("clavras01.so")</code>. | ||
+ | Com isto a rotina ''cormatern'' definida no código ''C'' pode ser chamada na sessão do R como no exemplo a seguir:<code R>> .C("cormatern", as.integer(10), as.double(1:10), as.double(1.5), res=as.double(rep(0,10)))$res</code> | ||
+ | |||
+ | Complementarmente, pode-se definir uma função R que seja um //wrapper// para facilitar a chamada da rotina ''C'' <code R> | ||
+ | "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) | ||
+ | </code> | ||
- | * {{:cursos:rlavras:clavras02.c|}} | + | ==== Exemplo 2 ==== |
- | * {{:cursos:rlavras:clavras.r|}} | + | 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: <code>$ R CMD SHLIB clavras01.c clavras01.c -o clavras.so</code> |
+ | Desta forma as três rotinas em ''C'' ficam disponíveis no R após carregar a biblioteca compatilhada com <code R>> dyn.load("clavras.so")</code> | ||