Fortran 90 + R: como carregar a dll

olá a todos, estou tentando aprender o básico de como construir um código em Fortran e usá-lo no R. Para tanto, criei o segundo código em Fortran: ------------------------------------------------------------------------------------------------ subroutine contador ! Compilar como DLL para uso no R implicit none integer n, i integer, allocatable :: r(:) read *, n allocate( r(n) ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!! do i = 1, n r(i) = i enddo !!!!!!!!!!!!!!!!!!!!!!!!!!!!! end subroutine ------------------------------------------------------------------------------------------------ No prompt do DOS, eu fui tentar usar o comando: R CMD SHLIB contador.f90 e obtive o seguinte erro: ------------------------------------------------------------------------------------------------ C:\Users\CLEBER\Documents\code\contador>R CMD SHLIB contador.f90 C:/R/etc/x64/Makeconf:196: warning: overriding commands for target `.m.o' C:/R/etc/x64/Makeconf:189: warning: ignoring old commands for target `.m.o' gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def contador.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/R/bin/x64 -lR /usr/bin/sh: line 8: gfortran -m64: command not found ------------------------------------------------------------------------------------------------ não entendi o motivo do erro... Gostaria de alguma ajuda nesse Ponto (1) <- *** Contornei o problema "Copiando & Colando" os comandos no prompt. O arquivo * tmp.def * não existe... mas então eu o criei por que havia compilado anteriormente com a IDE Code Blocks, e sabia da existência de um fulano *libcontador.def* +++++++++++++++++++++++++++++ o conteúdo de def é apenas: EXPORTS contador_ @1 +++++++++++++++++++++++++++++ ------------------------------------------------------------------------------------------------ gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def contador.o -Ld:/RCompile/CRANpkANpkg/extralibs64/local/lib -LC:/R/bin/x64 -lR ------------------------------------------------------------------------------------------------ Após os comandos acima é gerado o arquivo contador.dll No R, eu fui tentar carregar a dll, assim:
dyn.load('contador.dll')
dlls <- getLoadedDLLs() dlls
Filename Dynamic.Lookup base base FALSE utils C:/R/library/utils/libs/x64/utils.dll FALSE methods C:/R/library/methods/libs/x64/methods.dll FALSE grDevices C:/R/library/grDevices/libs/x64/grDevices.dll FALSE graphics C:/R/library/graphics/libs/x64/graphics.dll FALSE stats C:/R/library/stats/libs/x64/stats.dll FALSE contador C:/Users/CLEBER/Documents/code/contador/contador.dll TRUE
getDLLRegisteredRoutines('contador')
data frame with 0 columns and 0 rows
Porém não há registro da subrotina 'contador'... :-( Usei o comando: .Fortran('contador_', n=as.integer( 10 ) ) mas daí trava o R. Se alguém puder me ajudar a entender isso, agradeço desde já. cleber

Olá, boa noite. Como posso extrair uma parte de um texto de determinado site, utilizando o R ? É possível ? Existe algum material ? Obrigado desde já. Att Téo Calvo.

Caro Teodoro, Boa noite. Veja esse link http://r-br.2285057.n4.nabble.com/R-br-r-baixando-dados-inmet-td4660459.html Exite outras maneiras, mas você precisa saber python, assim segue outro exemplos. from ghost import Ghost from bs4 import BeautifulSoup as bs import re import time import regex from bs4 import BeautifulSoup import time ghost = Ghost() def load_account(): ghost.open("http://www.inmet.gov.br/projetos/rede/pesquisa/inicio.php") ghost.fill("form", {"mCod":"alissonluc@yahoo.com.br", "mSenha":"bv1k0wgj"}) ghost.set_field_value("input.botao", " Acessar ") ghost.click("input.botao", expect_loading=True) load_account() ghost.open("http://www.inmet.gov.br/projetos/rede/pesquisa/form_mapas_c_horario.php") ghost.fill("form", {"mRelDtInicio":"01/07/2012", "mRelDtFim":"01/08/2012", "mRelEstado":"MG", "mRelRegiao":"4", "mOpcaoAtrib1":"0", "mOpcaoAtrib2":"0", "mOpcaoAtrib5":"0", "mOpcaoAtrib6":"0", "mOpcaoAtrib8":"0", "mOpcaoAtrib9":"0", "mOpcaoAtrib12":"0"}) ghost.evaluate("document.frmCad.submit()", expect_loading=True) ghost.capture_to("/Users/Alisson/Desktop/lixo.png") soup = BeautifulSoup(ghost.content) urls = regex.findall(r"http://www.inmet.gov.br/projetos/rede/pesquisa/gera_serie_txt.php?[^ ]*", ghost.content) tables = {} errors = [] for url in urls: print url try: ghost.open(url) soup = BeautifulSoup(ghost.content) except: errors.append([url]) next try: cidade = regex.findall(r"Esta.*?o\s*?:\s([A-Z|\s]*-\s[A-Z]*)", soup.pre.get_text())[0] table = regex.findall(r"(Estacao;Data;Hora((.|\n)*))", soup.pre.get_text())[0][0] tables[cidade] = table time.sleep(2) except IndexError: errors.append([soup.pre]) next for cidade, tabela in tables.iteritems(): f = open("/Users/Alisson/Desktop/" + cidade + ".txt", "w") f.write(table) f.close() Abracos Alisson Lucrécio da Costa ________________________________ From: Teodoro Calvo <teocalvo2@gmail.com> To: r-br@listas.c3sl.ufpr.br Sent: Wednesday, October 2, 2013 8:43 PM Subject: [R-br] Usar R p/ importar informações da web Olá, boa noite. Como posso extrair uma parte de um texto de determinado site, utilizando o R ? É possível ? Existe algum material ? Obrigado desde já. Att Téo Calvo. _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Muito Obrigado ! Att Téo Calvo. Em 02-10-2013 20:54, Alisson Lucrecio escreveu:
Caro Teodoro, Boa noite.
Veja esse link http://r-br.2285057.n4.nabble.com/R-br-r-baixando-dados-inmet-td4660459.html
Exite outras maneiras, mas você precisa saber python, assim segue outro exemplos.
from ghost import Ghost from bs4 import BeautifulSoup as bs import re import time import regex from bs4 import BeautifulSoup import time ghost = Ghost()
def load_account(): ghost.open("http://www.inmet.gov.br/projetos/rede/pesquisa/inicio.php") ghost.fill("form", {"mCod":"alissonluc@yahoo.com.br", "mSenha":"bv1k0wgj"}) ghost.set_field_value("input.botao", " Acessar ") ghost.click("input.botao", expect_loading=True)
load_account()
ghost.open("http://www.inmet.gov.br/projetos/rede/pesquisa/form_mapas_c_horario.php")
ghost.fill("form", {"mRelDtInicio":"01/07/2012", "mRelDtFim":"01/08/2012", "mRelEstado":"MG", "mRelRegiao":"4", "mOpcaoAtrib1":"0", "mOpcaoAtrib2":"0", "mOpcaoAtrib5":"0", "mOpcaoAtrib6":"0", "mOpcaoAtrib8":"0", "mOpcaoAtrib9":"0", "mOpcaoAtrib12":"0"})
ghost.evaluate("document.frmCad.submit()", expect_loading=True)
ghost.capture_to("/Users/Alisson/Desktop/lixo.png")
soup = BeautifulSoup(ghost.content)
urls = regex.findall(r"http://www.inmet.gov.br/projetos/rede/pesquisa/gera_serie_txt.php?[^ ]*", ghost.content)
tables = {} errors = [] for url in urls: print url try: ghost.open(url) soup = BeautifulSoup(ghost.content) except: errors.append([url]) next try: cidade = regex.findall(r"Esta.*?o\s*?:\s([A-Z|\s]*-\s[A-Z]*)", soup.pre.get_text())[0] table = regex.findall(r"(Estacao;Data;Hora((.|\n)*))", soup.pre.get_text())[0][0] tables[cidade] = table time.sleep(2) except IndexError: errors.append([soup.pre]) next
for cidade, tabela in tables.iteritems(): f = open("/Users/Alisson/Desktop/" + cidade + ".txt", "w") f.write(table) f.close()
Abracos Alisson Lucrécio da Costa ------------------------------------------------------------------------ *From:* Teodoro Calvo <teocalvo2@gmail.com> *To:* r-br@listas.c3sl.ufpr.br *Sent:* Wednesday, October 2, 2013 8:43 PM *Subject:* [R-br] Usar R p/ importar informações da web
Olá, boa noite.
Como posso extrair uma parte de um texto de determinado site, utilizando o R ? É possível ? Existe algum material ?
Obrigado desde já.
Att Téo Calvo.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto:R-br@listas.c3sl.ufpr.br> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Oi Cleber, Nao sei qual foi o problema. So' gostaria de questionar: porque voce esta lendo o tamanho do vetor? Ate onde sei, e' melhor declarar objetos no R e passa-los a subrotina. No seu caso, poderia ser subroutine contador(n,r) ! Compilar como dynamic library para uso no R integer n, i integer r(n) !!!!!!!!!!!!!!!!!!!!!!!!!!!!! do i = 1, n r(i) = i enddo !!!!!!!!!!!!!!!!!!!!!!!!!!!!! end subroutine e para mim funcionou bem (em Linux, of course) :) On 10/03/2013 01:16 AM, Cleber N.Borges wrote:
olá a todos,
estou tentando aprender o básico de como construir um código em Fortran e usá-lo no R.
Para tanto, criei o segundo código em Fortran: ------------------------------------------------------------------------------------------------ subroutine contador ! Compilar como DLL para uso no R implicit none integer n, i integer, allocatable :: r(:) read *, n allocate( r(n) ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!! do i = 1, n r(i) = i enddo !!!!!!!!!!!!!!!!!!!!!!!!!!!!! end subroutine ------------------------------------------------------------------------------------------------
No prompt do DOS, eu fui tentar usar o comando: R CMD SHLIB contador.f90 e obtive o seguinte erro:
------------------------------------------------------------------------------------------------ C:\Users\CLEBER\Documents\code\contador>R CMD SHLIB contador.f90 C:/R/etc/x64/Makeconf:196: warning: overriding commands for target `.m.o' C:/R/etc/x64/Makeconf:189: warning: ignoring old commands for target `.m.o' gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def contador.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/R/bin/x64 -lR /usr/bin/sh: line 8: gfortran -m64: command not found ------------------------------------------------------------------------------------------------
não entendi o motivo do erro...
Gostaria de alguma ajuda nesse Ponto (1) <- ***
Contornei o problema "Copiando & Colando" os comandos no prompt.
O arquivo * tmp.def * não existe... mas então eu o criei por que havia compilado anteriormente com a IDE Code Blocks, e sabia da existência de um fulano *libcontador.def*
+++++++++++++++++++++++++++++ o conteúdo de def é apenas: EXPORTS contador_ @1 +++++++++++++++++++++++++++++
------------------------------------------------------------------------------------------------ gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def contador.o -Ld:/RCompile/CRANpkANpkg/extralibs64/local/lib -LC:/R/bin/x64 -lR ------------------------------------------------------------------------------------------------
Após os comandos acima é gerado o arquivo contador.dll
No R, eu fui tentar carregar a dll, assim:
dyn.load('contador.dll')
dlls <- getLoadedDLLs() dlls
Filename Dynamic.Lookup base base FALSE utils C:/R/library/utils/libs/x64/utils.dll FALSE methods C:/R/library/methods/libs/x64/methods.dll FALSE grDevices C:/R/library/grDevices/libs/x64/grDevices.dll FALSE graphics C:/R/library/graphics/libs/x64/graphics.dll FALSE stats C:/R/library/stats/libs/x64/stats.dll FALSE contador C:/Users/CLEBER/Documents/code/contador/contador.dll TRUE
getDLLRegisteredRoutines('contador')
data frame with 0 columns and 0 rows
Porém não há registro da subrotina 'contador'... :-(
Usei o comando: .Fortran('contador_', n=as.integer( 10 ) )
mas daí trava o R.
Se alguém puder me ajudar a entender isso, agradeço desde já.
cleber
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

obrigado Elias pelo help, compilei o codigo com sua modificação. Não gera nenhum erro porém gera um resultado absurdo aqui na minha máquina. Reproduza abaixo: ############################################
system("gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o") system("gfortran -m64 -shared -s -static-libgcc -o contador.dll contador.o") dyn.load('contador.dll') is.loaded('contador') [1] TRUE
getNativeSymbolInfo('contador') $name [1] "contador"
$address <pointer: 0x00000000100c1450> attr(,"class") [1] "NativeSymbol" $package NULL attr(,"class") [1] "NativeSymbolInfo"
.Fortran('contador', n=as.integer(5), r=numeric(5))
$n [1] 5 $r [1] 8.487983e-314 3.395193e-313 1.235164e-322 0.000000e+00 0.000000e+00
obrigado novamente cleber Em 03/10/2013 04:57, Elias T Krainski escreveu:
Oi Cleber,
Nao sei qual foi o problema. So' gostaria de questionar: porque voce esta lendo o tamanho do vetor?
Ate onde sei, e' melhor declarar objetos no R e passa-los a subrotina. No seu caso, poderia ser
subroutine contador(n,r) ! Compilar como dynamic library para uso no R integer n, i integer r(n) !!!!!!!!!!!!!!!!!!!!!!!!!!!!! do i = 1, n r(i) = i enddo !!!!!!!!!!!!!!!!!!!!!!!!!!!!! end subroutine
e para mim funcionou bem (em Linux, of course) :)
On 10/03/2013 01:16 AM, Cleber N.Borges wrote:
olá a todos,
estou tentando aprender o básico de como construir um código em Fortran e usá-lo no R.
Para tanto, criei o segundo código em Fortran: ------------------------------------------------------------------------------------------------ subroutine contador ! Compilar como DLL para uso no R implicit none integer n, i integer, allocatable :: r(:) read *, n allocate( r(n) ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!! do i = 1, n r(i) = i enddo !!!!!!!!!!!!!!!!!!!!!!!!!!!!! end subroutine ------------------------------------------------------------------------------------------------
No prompt do DOS, eu fui tentar usar o comando: R CMD SHLIB contador.f90 e obtive o seguinte erro:
------------------------------------------------------------------------------------------------ C:\Users\CLEBER\Documents\code\contador>R CMD SHLIB contador.f90 C:/R/etc/x64/Makeconf:196: warning: overriding commands for target `.m.o' C:/R/etc/x64/Makeconf:189: warning: ignoring old commands for target `.m.o' gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def contador.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/R/bin/x64 -lR /usr/bin/sh: line 8: gfortran -m64: command not found ------------------------------------------------------------------------------------------------
não entendi o motivo do erro...
Gostaria de alguma ajuda nesse Ponto (1) <- ***
Contornei o problema "Copiando & Colando" os comandos no prompt.
O arquivo * tmp.def * não existe... mas então eu o criei por que havia compilado anteriormente com a IDE Code Blocks, e sabia da existência de um fulano *libcontador.def*
+++++++++++++++++++++++++++++ o conteúdo de def é apenas: EXPORTS contador_ @1 +++++++++++++++++++++++++++++
------------------------------------------------------------------------------------------------ gfortran -m64 -O2 -mtune=core2 -c contador.f90 -o contador.o gfortran -m64 -shared -s -static-libgcc -o contador.dll tmp.def contador.o -Ld:/RCompile/CRANpkANpkg/extralibs64/local/lib -LC:/R/bin/x64 -lR ------------------------------------------------------------------------------------------------
Após os comandos acima é gerado o arquivo contador.dll
No R, eu fui tentar carregar a dll, assim:
dyn.load('contador.dll')
dlls <- getLoadedDLLs() dlls
Filename Dynamic.Lookup base base FALSE utils C:/R/library/utils/libs/x64/utils.dll FALSE methods C:/R/library/methods/libs/x64/methods.dll FALSE grDevices C:/R/library/grDevices/libs/x64/grDevices.dll FALSE graphics C:/R/library/graphics/libs/x64/graphics.dll FALSE stats C:/R/library/stats/libs/x64/stats.dll FALSE contador C:/Users/CLEBER/Documents/code/contador/contador.dll TRUE
getDLLRegisteredRoutines('contador')
data frame with 0 columns and 0 rows
Porém não há registro da subrotina 'contador'... :-(
Usei o comando: .Fortran('contador_', n=as.integer( 10 ) )
mas daí trava o R.
Se alguém puder me ajudar a entender isso, agradeço desde já.
cleber

O erro e' porque vc passou um numeric(5) no lugar de integer(5). Deve ser integer() porque r (na subroutine) e' integer... tente: .Fortran('contador', n=as.integer(5), r=integer(5))

obrigado Elias, agora funcionou muito bem! cleber Em 03/10/2013 13:00, Elias T Krainski escreveu:
O erro e' porque vc passou um numeric(5) no lugar de integer(5). Deve ser integer() porque r (na subroutine) e' integer... tente: .Fortran('contador', n=as.integer(5), r=integer(5)) _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
participantes (4)
-
Alisson Lucrecio
-
Cleber N.Borges
-
Elias T Krainski
-
Teodoro Calvo