Não foi possível enviar o arquivo. Será algum problema com as permissões?
Diferenças

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Próxima revisão
Revisão anterior
cursos:rlavras:compilado [2008/11/02 12:54]
paulojus criada
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 ======
  
-  * {{:​cursos:​rlavras:​clavras01.c|}} +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. 
-  * {{:cursos:rlavras:clavras02.c|}} +Os exemplo assumem que todos os arquivos estão no mesmo diretório (pasta) da área de trabalho da sessão do R. 
-  ​{{:​cursos:​rlavras:​clavras.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) <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 ==== 
 +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 ​{{:​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>​ 
 + 
 + 
 +==== 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: <​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>​
  

QR Code
QR Code cursos:rlavras:compilado (generated for current page)