Re: [R-br] [Dúvida] Invocar funções C++ no R

Quando eu falo conectado quero dizer que ele não está sendo reconhecido no DOS. Tava lendo um tutorial que ele manda testar se as variáveis ambientes adicionadas foram colocadas de forma correta. Para ver se o gcc está sendo reconhecido pelo DOS o tutorial manda digitar gcc --help. Para ver se o R está podendo ser chamado pelo DOS sem referenciar o caminho visto que o patch foi add corretamente ele manda fazer R.exe. Já para ver se a variável ambiente do Rtools está adicionada de forma correta ele manda digitar o comando grep. Contudo consegui corrigir o problema a poucos minutos atrás. Muito obrigado Benilton pelas dicas. Qualquer dúvida a mais que tiver eu irei aperriar (risos). Em 26 de agosto de 2011 08:55, Pedro Rafael <pedro.rafael.marinho@gmail.com>escreveu:
Quando eu falo conectado quero dizer que ele não está sendo reconhecido no DOS. Tava lendo um tutorial q
Em 26 de agosto de 2011 08:41, beniltoncarvalho [via R-br] < ml-node+3770614-1267126705-223914@n4.nabble.com> escreveu:
O que exatamente vc quer dizer com 'RTools nao esta conectado'? RTools
e' apenas um conjunto de ferramentas (MinGW, Perl, etc) e essas voce acessa pelo terminal do DOS. Note que, com o RTools, vc nao precisa do gcc. _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3770614&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.
-- Saudações, Pedro Rafael Diniz Marinho.

Confirme que sua variavel PATH aponta para a localizacao correta do RTools e MinGW. Por exemplo, se o RTools foi instalado em "c:\RTools", entao confirme que a variavel PATH tenha os seguintes valores inclusos: c:\Rtools\bin;c:\Rtools\MinGW\bin; Eu so' nao tenho certeza se, depois de mudar os valores de PATH, vc vai precisar reiniciar o computador... Uma vez que voce tenha certeza de que a variavel PATH tem os valores corretos, voce abre um novo terminal DOS e tenta o grep.... b

Benilton realmente no Windows o arquivo gerado e uma dll como você tinha falado. Consegui gerar um programa chamado hello.c. O conteúdo do programa apresenta-se logo abaixo: #include <R.h> void hello(int *n) { int i; for(i=0; i < *n; i++) { Rprintf("Hello, world!\n"); } } Fui no terminal do DOS e digitei R CMD SHLIB hello.c e o arquivo hello.dll foi gerado. Setei o R no diretório da dll e fiz:
dyn.load("hello.dll") Erro em inDL(x, as.logical(local), as.logical(now), ...) : impossível carregar objeto compartilhado 'C:/PEDRO/PACOTES_R/hello.dll': LoadLibrary failure: %1 não é um aplicativo Win32 válido. specificado.
Como você pode ver deu um erro. O que pode ter sido? Em 26 de agosto de 2011 09:19, beniltoncarvalho [via R-br] < ml-node+3770707-1188459073-223914@n4.nabble.com> escreveu:
Confirme que sua variavel PATH aponta para a localizacao correta do RTools e MinGW. Por exemplo, se o RTools foi instalado em "c:\RTools", entao confirme que a variavel PATH tenha os seguintes valores inclusos:
c:\Rtools\bin;c:\Rtools\MinGW\bin;
Eu so' nao tenho certeza se, depois de mudar os valores de PATH, vc vai precisar reiniciar o computador...
Uma vez que voce tenha certeza de que a variavel PATH tem os valores corretos, voce abre um novo terminal DOS e tenta o grep....
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3770707&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.

Já vi o erro. Fiz uma besteira de compilar o código em 32bits e tava tentando rodar no R 64bits. Na verdade eu acho que um código 32bits era para rodar sem problemas em no 64bits. Em 26 de agosto de 2011 09:40, Pedro Rafael <pedro.rafael.marinho@gmail.com>escreveu:
Benilton realmente no Windows o arquivo gerado e uma dll como você tinha falado. Consegui gerar um programa chamado hello.c. O conteúdo do programa apresenta-se logo abaixo:
#include <R.h> void hello(int *n) { int i; for(i=0; i < *n; i++) { Rprintf("Hello, world!\n"); } }
Fui no terminal do DOS e digitei R CMD SHLIB hello.c e o arquivo hello.dll foi gerado. Setei o R no diretório da dll e fiz:
dyn.load("hello.dll") Erro em inDL(x, as.logical(local), as.logical(now), ...) : impossível carregar objeto compartilhado 'C:/PEDRO/PACOTES_R/hello.dll': LoadLibrary failure: %1 não é um aplicativo Win32 válido. specificado.
Como você pode ver deu um erro. O que pode ter sido?
Em 26 de agosto de 2011 09:19, beniltoncarvalho [via R-br] < ml-node+3770707-1188459073-223914@n4.nabble.com> escreveu:
Confirme que sua variavel PATH aponta para a localizacao correta do
RTools e MinGW. Por exemplo, se o RTools foi instalado em "c:\RTools", entao confirme que a variavel PATH tenha os seguintes valores inclusos:
c:\Rtools\bin;c:\Rtools\MinGW\bin;
Eu so' nao tenho certeza se, depois de mudar os valores de PATH, vc vai precisar reiniciar o computador...
Uma vez que voce tenha certeza de que a variavel PATH tem os valores corretos, voce abre um novo terminal DOS e tenta o grep....
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3770707&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.
-- Saudações, Pedro Rafael Diniz Marinho.

O que vc quer dizer e' que aplicativos 32 bits sao esperados rodar em equipamentos com OS 64 bits. Isso e' verdade (veja o proprio caso do R). Acontece que ao compilar alguma biblioteca, a compilacao torna aquele codigo especifico para a plataforma na qual foi compilados. Entao, a solucao e' compilar multiplas versoes (uma para cada arquitetura) e e' isso que e' feito em bundles multi-arquitetura. b

Particularmente vocês utilizam a função .C ou .Call para chamar o arquivo .so para aqueles que estão no Linux ou o arquivo .dll para os que estão com Windows? Em 26 de agosto de 2011 10:30, beniltoncarvalho [via R-br] < ml-node+3770846-1961271061-223914@n4.nabble.com> escreveu:
O que vc quer dizer e' que aplicativos 32 bits sao esperados rodar em equipamentos com OS 64 bits. Isso e' verdade (veja o proprio caso do R).
Acontece que ao compilar alguma biblioteca, a compilacao torna aquele codigo especifico para a plataforma na qual foi compilados. Entao, a solucao e' compilar multiplas versoes (uma para cada arquitetura) e e' isso que e' feito em bundles multi-arquitetura.
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3770846&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.

Depende apenas do que vc estiver fazendo. .Call() e' conveniente por retornar objetos ao R diretamente. O .C() e' legal pq vc pode pegar funcoes ja' prontas em C e apenas criar um wrapper (vide GSL). b

Fiz um programa muito simples para entender. O programa simplesmente soma um número com outro e está abaixo: /* INICIO */ #include <R.h> /* Funcao Principal */ void soma1(double *a, double *b, double *res) { *res = *a + *b; } /* FIM */ Depois de gerar o arquivo soma1.dll fiz no R: dyn.load("soma1.dll") soma2 <- function(a,b){ .C("soma1", as.double(a), as.double(b), res = a + b)$res } O programa está pensado corretamente? Aproveito para pedir desculpas por aperriar tanto vocês e batendo na tecla só nesse assunto. Saudações, Pedro Rafael Em 26 de agosto de 2011 12:37, beniltoncarvalho [via R-br] < ml-node+3771222-499417778-223914@n4.nabble.com> escreveu:
Depende apenas do que vc estiver fazendo. .Call() e' conveniente por retornar objetos ao R diretamente. O .C() e' legal pq vc pode pegar funcoes ja' prontas em C e apenas criar um wrapper (vide GSL). b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3771222&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.

Estou com uma dúvida! Se for criar um pacote no R (apenas para uso interno aqui na empresa) com diversas rotinas em C, terei que compilá-lo para cada uma dos OS e arquiteruras? No caso uso Win e Linux (32 e 64)! Atenciosamente, Leandro Lins Marino Centro de Avaliação Fundação CESGRANRIO Rua Santa Alexandrina, 1011 - 2º andar Rio de Janeiro, RJ - CEP: 20261-903 ( (21) 2103-9600 R.:236 * leandro@cesgranrio.org.br P Antes de imprimir pense em sua responsabilidade e compromisso com o MEIO AMBIENTE Esta mensagem, incluindo seus anexos, pode conter informacoes privilegiadas e/ou de carater confidencial, nao podendo ser retransmitida sem autorizacao do remetente. Se voce nao e o destinatario ou pessoa autorizada a recebe-la, informamos que o seu uso, divulgacao, copia ou arquivamento sao proibidos. Portanto, se você recebeu esta mensagem por engano, por favor, nos informe respondendo imediatamente a este e-mail e em seguida apague-a. De: r-br-bounces@listas.c3sl.ufpr.br [mailto:r-br-bounces@listas.c3sl.ufpr.br] Em nome de Pedro Rafael Enviada em: sexta-feira, 26 de agosto de 2011 16:34 Para: r-br@listas.c3sl.ufpr.br Assunto: Re: [R-br] [Dúvida] Invocar funções C++ no R Fiz um programa muito simples para entender. O programa simplesmente soma um número com outro e está abaixo: /* INICIO */ #include <R.h> /* Funcao Principal */ void soma1(double *a, double *b, double *res) { *res = *a + *b; } /* FIM */ Depois de gerar o arquivo soma1.dll fiz no R: dyn.load("soma1.dll") soma2 <- function(a,b){ .C("soma1", as.double(a), as.double(b), res = a + b)$res } O programa está pensado corretamente? Aproveito para pedir desculpas por aperriar tanto vocês e batendo na tecla só nesse assunto. Saudações, Pedro Rafael Em 26 de agosto de 2011 12:37, beniltoncarvalho [via R-br] <ml-node+3771222-499417778-223914@n4.nabble.com <mailto:ml-node%2B3771222-499417778-223914@n4.nabble.com> > escreveu: Depende apenas do que vc estiver fazendo. .Call() e' conveniente por retornar objetos ao R diretamente. O .C() e' legal pq vc pode pegar funcoes ja' prontas em C e apenas criar um wrapper (vide GSL). b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3771222&i=0> 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. _____ If you reply to this email, your message will be added to the discussion below: http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681 59p3771222.html To unsubscribe from R-br, click here <http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscrib e_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5 ODJ8NTAyMjI0MDYw> . -- Saudações, Pedro Rafael Diniz Marinho.

O do Windows vc tem mesmo que compilar para gerar o ZIP. Os do Linux sao compilados no momento da instalacao. b

*E logicamente o pacote compilado em um não funciona no outro! :( *Atenciosamente, Leandro Marino http://www.leandromarino.com.br (Fotógrafo) http://est.leandromarino.com.br/Blog (Estatístico) Cel.: + 55 21 9845-7707 Cel.: + 55 21 8777-7907 Em 26 de agosto de 2011 16:56, Benilton Carvalho <beniltoncarvalho@gmail.com
escreveu:
O do Windows vc tem mesmo que compilar para gerar o ZIP.
Os do Linux sao compilados no momento da instalacao.
b _______________________________________________ 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.

Compilado em Windows vai funcionar outras maquinas Windows com a mesma arquitetura. Para Linux, voce sempre distribui o codigo-fonte do pacote.

Uma coisa que me parece ser comum é: A pessoa só irá recorrer a C ou C++ ou o Fortran caso queira melhorar o desempenho computacional visando diminuir o tempo de execução do script R. Isso se dá geralmente quando temos vários FOR aninhados por exemplo. Percebi que o R "sofre" bastante quando temos vários FOR um dentro do outro. Logo posso recorrer ao C para minimizar o tempo o que faz mais sentido talvez usar .C(). O comando .Call() chama algumas funções do R para o programa em C o que talvez possa te dar um custo mais no quesito tempo de execução? Achei mais complicado usar .Call() pois tem várias funções para proteger uma variável PROTECTE bem como vários outros detalhes. Usando .C só temos que prestar atenção nos ponteiros para que não haja maiores problemas. Benilton valeu pelas dicas e paciência. Em 26 de agosto de 2011 18:46, beniltoncarvalho [via R-br] < ml-node+3772100-1247408194-223914@n4.nabble.com> escreveu:
Compilado em Windows vai funcionar outras maquinas Windows com a mesma arquitetura.
Para Linux, voce sempre distribui o codigo-fonte do pacote. _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3772100&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.

Exato, o .Call() oferece uma melhor interface com o R e tambem permite que vc retorne objetos para o R. O lance do PROTECT() e' pq o R possui um sistema de "garbage collection", entao se vc nao proteger a sua variavel em C (via .Call) o R vai acabar "limpando" o espaco de memoria usado pelo C e coisas inesperadas vao acontecer. O legal de usar .C(), como eu comentei anteriormente e voce notou, e' que voce pode fazer seu programa C independente do R... dai', se for usar com o R, e' apenas dar-se ao trabalho de criar uma funcaozinha que receba os ponteiros do R e passe os argumentos apropriados para a funcao C. b

*Pedro, em geral quando você tem vários FOR aninhados você pode substituí-los por sapply, lapply ou genéricos. Cada caso é um caso e deve ser avaliado com cuidado. Particularmente, pretendo desenvolver em C um conjunto de funções antigas do Prof. Ruben que rodam em FORTRAN (apenas em compiladores mais antigos) para que possamos usá-las dentro do R, ganhando um precioso tempo, entre exportar, rodar e importar os dados novamente. *Atenciosamente, Leandro Marino http://www.leandromarino.com.br (Fotógrafo) http://est.leandromarino.com.br/Blog (Estatístico) Cel.: + 55 21 9845-7707 Cel.: + 55 21 8777-7907 Em 26 de agosto de 2011 15:39, Benilton Carvalho <beniltoncarvalho@gmail.com
escreveu:
Exato, o .Call() oferece uma melhor interface com o R e tambem permite que vc retorne objetos para o R. O lance do PROTECT() e' pq o R possui um sistema de "garbage collection", entao se vc nao proteger a sua variavel em C (via .Call) o R vai acabar "limpando" o espaco de memoria usado pelo C e coisas inesperadas vao acontecer.
O legal de usar .C(), como eu comentei anteriormente e voce notou, e' que voce pode fazer seu programa C independente do R... dai', se for usar com o R, e' apenas dar-se ao trabalho de criar uma funcaozinha que receba os ponteiros do R e passe os argumentos apropriados para a funcao C.
b _______________________________________________ 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.

E sobre of for()s, eu ja' postei aqui que eles nao sao (mais) tao lentos quanto pregam.

Eu trabalho na Secretaria de Estado da Saúde da Paraíba. Tudo que eu faço no R dentro da academia dá certo sem a necessidade de recorrer a mais nenhum outro software ou linguagem estatística. As secretarias de saúde de todos estados não só da Paraíba precisam sempre calcular indicadores básicos de saúde (básicos mesmo). O ruim que são indicadores muito simples como a taxa de mortalidade infantil. Como o Brasil é um país que as estatísticas vitais apresenta deficiências, ou seja, sub-registros de informações bem como outros problemas a taxa de mortalidade infantil não é simplesmente a razão de óbitos de menores de 1 ano sobre o número de nascidos vivos. Contudo, eu sou de certa forma obrigado a fazer o cálculo simples pois o Ministério da Saúde só aceita os cálculos assim por meio de portarias. Tudo isso para dizer: MINHAS CONTAS SÃO SIMPLES. Todavia minhas bases de dados são são tão pequenas. Trabalho som Sistemas de Informação de Nascidos vivos - SINASC e o Sistema de Informação sobre Mortalidade - SIM. Criei várias funções no R para para cálculos de alguns indicadores como por exemplo: taxa de mortalidade neonatal, neonatal precoce, taxa de letalidade das formas graves de dengue, etc. A Paraíba tem 223 municípios e os dados são desde 1999, mensais. Eu usei vários FOR onde o primeiro por exemplo eu corro nos municípios e o outro eu corro nos anos para ter uma série histórica. A cada passo nos FOR, ou seja, quando o município for João Pessoa e o ano for 1999, por exemplo, eu uso SUBSET para filtrar o banco com essas características e busco a primeira dimensão dim()[1] (Número de linhas). Dessa forma, eu tenho o número de óbitos de João Pessoa no ano 1999 (Número de Registros). Veja, o primeiro FOR vai variara na sequência 1:223 e o segundo entre os anos de 1999 a 2011, e tudo isto para ter apenas o numerador do indicador. Imagine um banco com com umas 700 mil linhas, banco este em formato DBF. Eu simplifiquei bastante o exemplo pois existe várias outras peculiaridades. Certamente, deve existir formas mais inteligentes de fazer isto mas essa foi uma que encontre e tá me dando a resposta que quero. Eu vi que as funções sapply e derivados é mais interessante quando quero aplicar funções a alguma dimensão de um data.frame ou matriz. Para "talhar" minha base de dados achei melhor usar o SUBSET, talvez por não entender muito. O cálculo de cada indicador não demora muito, uns 2 minutos no máximo mas queria otimizar mais e pensei em usar C na hora da entrada nos FOR o que pode ser uma saída. Em 26 de agosto de 2011 21:05, beniltoncarvalho [via R-br] < ml-node+3772320-650293871-223914@n4.nabble.com> escreveu:
E sobre of for()s, eu ja' postei aqui que eles nao sao (mais) tao lentos quanto pregam. _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3772320&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.

Não se pode criar uma variável register em um programa C para posteriormente ser reconhecida no R? Em 26 de agosto de 2011 21:58, Pedro Rafael <pedro.rafael.marinho@gmail.com>escreveu:
Eu trabalho na Secretaria de Estado da Saúde da Paraíba. Tudo que eu faço no R dentro da academia dá certo sem a necessidade de recorrer a mais nenhum outro software ou linguagem estatística. As secretarias de saúde de todos estados não só da Paraíba precisam sempre calcular indicadores básicos de saúde (básicos mesmo). O ruim que são indicadores muito simples como a taxa de mortalidade infantil. Como o Brasil é um país que as estatísticas vitais apresenta deficiências, ou seja, sub-registros de informações bem como outros problemas a taxa de mortalidade infantil não é simplesmente a razão de óbitos de menores de 1 ano sobre o número de nascidos vivos. Contudo, eu sou de certa forma obrigado a fazer o cálculo simples pois o Ministério da Saúde só aceita os cálculos assim por meio de portarias. Tudo isso para dizer: MINHAS CONTAS SÃO SIMPLES. Todavia minhas bases de dados são são tão pequenas. Trabalho som Sistemas de Informação de Nascidos vivos - SINASC e o Sistema de Informação sobre Mortalidade - SIM. Criei várias funções no R para para cálculos de alguns indicadores como por exemplo: taxa de mortalidade neonatal, neonatal precoce, taxa de letalidade das formas graves de dengue, etc. A Paraíba tem 223 municípios e os dados são desde 1999, mensais. Eu usei vários FOR onde o primeiro por exemplo eu corro nos municípios e o outro eu corro nos anos para ter uma série histórica. A cada passo nos FOR, ou seja, quando o município for João Pessoa e o ano for 1999, por exemplo, eu uso SUBSET para filtrar o banco com essas características e busco a primeira dimensão dim()[1] (Número de linhas). Dessa forma, eu tenho o número de óbitos de João Pessoa no ano 1999 (Número de Registros). Veja, o primeiro FOR vai variara na sequência 1:223 e o segundo entre os anos de 1999 a 2011, e tudo isto para ter apenas o numerador do indicador. Imagine um banco com com umas 700 mil linhas, banco este em formato DBF. Eu simplifiquei bastante o exemplo pois existe várias outras peculiaridades. Certamente, deve existir formas mais inteligentes de fazer isto mas essa foi uma que encontre e tá me dando a resposta que quero. Eu vi que as funções sapply e derivados é mais interessante quando quero aplicar funções a alguma dimensão de um data.frame ou matriz. Para "talhar" minha base de dados achei melhor usar o SUBSET, talvez por não entender muito. O cálculo de cada indicador não demora muito, uns 2 minutos no máximo mas queria otimizar mais e pensei em usar C na hora da entrada nos FOR o que pode ser uma saída.
Em 26 de agosto de 2011 21:05, beniltoncarvalho [via R-br] < ml-node+3772320-650293871-223914@n4.nabble.com> escreveu:
E sobre of for()s, eu ja' postei aqui que eles nao sao (mais) tao
lentos quanto pregam. _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3772320&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.
-- Saudações, Pedro Rafael Diniz Marinho.

Benilton e demais amigos, obrigado pela contribuição neste tópico. Agora consegui otimizar a minha função importando comandos em C para o R. Estava com alguns for aninhados que em R tava consumindo muito tempo. Criei a DLL e importei para o R e o tempo de execução diminuiu drasticamente. ---------- Mensagem encaminhada ---------- De: Pedro Rafael <pedro.rafael.marinho@gmail.com> Data: 29 de agosto de 2011 22:32 Assunto: Re: [R-br] RES: [Dúvida] Invocar funções C++ no R Para: r-br@listas.c3sl.ufpr.br Não se pode criar uma variável register em um programa C para posteriormente ser reconhecida no R? Em 26 de agosto de 2011 21:58, Pedro Rafael <pedro.rafael.marinho@gmail.com>escreveu: Eu trabalho na Secretaria de Estado da Saúde da Paraíba. Tudo que eu faço no
R dentro da academia dá certo sem a necessidade de recorrer a mais nenhum outro software ou linguagem estatística. As secretarias de saúde de todos estados não só da Paraíba precisam sempre calcular indicadores básicos de saúde (básicos mesmo). O ruim que são indicadores muito simples como a taxa de mortalidade infantil. Como o Brasil é um país que as estatísticas vitais apresenta deficiências, ou seja, sub-registros de informações bem como outros problemas a taxa de mortalidade infantil não é simplesmente a razão de óbitos de menores de 1 ano sobre o número de nascidos vivos. Contudo, eu sou de certa forma obrigado a fazer o cálculo simples pois o Ministério da Saúde só aceita os cálculos assim por meio de portarias. Tudo isso para dizer: MINHAS CONTAS SÃO SIMPLES. Todavia minhas bases de dados são são tão pequenas. Trabalho som Sistemas de Informação de Nascidos vivos - SINASC e o Sistema de Informação sobre Mortalidade - SIM. Criei várias funções no R para para cálculos de alguns indicadores como por exemplo: taxa de mortalidade neonatal, neonatal precoce, taxa de letalidade das formas graves de dengue, etc. A Paraíba tem 223 municípios e os dados são desde 1999, mensais. Eu usei vários FOR onde o primeiro por exemplo eu corro nos municípios e o outro eu corro nos anos para ter uma série histórica. A cada passo nos FOR, ou seja, quando o município for João Pessoa e o ano for 1999, por exemplo, eu uso SUBSET para filtrar o banco com essas características e busco a primeira dimensão dim()[1] (Número de linhas). Dessa forma, eu tenho o número de óbitos de João Pessoa no ano 1999 (Número de Registros). Veja, o primeiro FOR vai variara na sequência 1:223 e o segundo entre os anos de 1999 a 2011, e tudo isto para ter apenas o numerador do indicador. Imagine um banco com com umas 700 mil linhas, banco este em formato DBF. Eu simplifiquei bastante o exemplo pois existe várias outras peculiaridades. Certamente, deve existir formas mais inteligentes de fazer isto mas essa foi uma que encontre e tá me dando a resposta que quero. Eu vi que as funções sapply e derivados é mais interessante quando quero aplicar funções a alguma dimensão de um data.frame ou matriz. Para "talhar" minha base de dados achei melhor usar o SUBSET, talvez por não entender muito. O cálculo de cada indicador não demora muito, uns 2 minutos no máximo mas queria otimizar mais e pensei em usar C na hora da entrada nos FOR o que pode ser uma saída.
Em 26 de agosto de 2011 21:05, beniltoncarvalho [via R-br] < ml-node+3772320-650293871-223914@n4.nabble.com> escreveu:
E sobre of for()s, eu ja' postei aqui que eles nao sao (mais) tao
lentos quanto pregam. _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3772320&i=0> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.
-- Saudações, Pedro Rafael Diniz Marinho. -- Saudações, Pedro Rafael Diniz Marinho. Estatístico - Secretaria de Estado da Saúde - PB.

Em 26/8/2011 20:35, Leandro Marino escreveu: Leandro,
/Pedro,
em geral quando você tem vários FOR aninhados você pode substituí-los por sapply, lapply ou genéricos. Cada caso é um caso e deve ser avaliado com cuidado. Esse é o famoso caso em que "só aprende a desfrutar da juventude quando já se está velho demais".
Se somente após rodar as duas formas ter-se-á certeza, mas aí já se tem resultados, e como você mesmo escreve cada caso é um caso, então a solução não ajuda em casos em que se tenha que repetir a análise com dados diferentes....
Particularmente, pretendo desenvolver em C um conjunto de funções antigas do Prof. Ruben que rodam em FORTRAN (apenas em compiladores mais antigos) para que possamos usá-las dentro do R, ganhando um precioso tempo, entre exportar, rodar e importar os dados novamente.
Tecnicamente você vai _portar_ o conjunto de funções antigas, supondo que os algoritmos serão os mesmos e que você disponha de dados (de entrada) e resultados já conhecidos para efetuar testes. Ainda assim, vale a pena alertá-lo que esse porte pode exigir mais que somente tradução do código de Fortran para C (que por sinal pode ser automatizado, em parte, usando um programa denominado f2c): O Fortran e o C têm "expectativas" diferentes quanto à organização de matrizes (http://stackoverflow.com/questions/227627/fortran-array-to-c-array-stupid-ma...) Os arrays em Fortran começam a partir de um enquanto em C a partir de zero. Como em programação matemática a forma do Fortran faz mais sentido existem até propostas de "jambrar" o código em C para "emualar" esse tipo de programação (Numerical Recipes in C, 2ª edição, pg 18 [versão considerada "obsoleta" disponível p/consulta em http://apps.nrbook.com/c/index.html) que os especialistas em C deprecam (http://c-faq.com/aryptr/non0based.html). Há ainda que tomar cuidado com tipos (conversão). . . HTH -- Cesar Rabak GNU/Linux User 52247. Get counted: http://counter.li.org/

Fiz um programa muito simples para entender. O programa simplesmente soma um número com outro e está abaixo: /* INICIO */ #include <R.h> /* Funcao Principal */ void soma1(double *a, double *b, double *res) { *res = *a + *b; } /* FIM */ Depois de gerar o arquivo soma1.dll fiz no R: dyn.load("soma1.dll") soma2 <- function(a,b){ .C("soma1", as.double(a), as.double(b), res = a + b)$res } O programa está pensado corretamente? Aproveito para pedir desculpas por aperriar tanto vocês e batendo na tecla só nesse assunto. Saudações, Pedro Rafael Em 26 de agosto de 2011 16:57, Leandro Marino [via R-br] < ml-node+3771831-993372325-223914@n4.nabble.com> escreveu:
Estou com uma dúvida!****
** **
Se for criar um pacote no R (apenas para uso interno aqui na empresa) com diversas rotinas em C, terei que compilá-lo para cada uma dos OS e arquiteruras? No caso uso Win e Linux (32 e 64)!
****
** **
Atenciosamente, *Leandro Lins Marino** **Centro de Avaliação** **Fundação CESGRANRIO** **Rua Santa Alexandrina, 1011 - 2º andar** **Rio de Janeiro, RJ - CEP: 20261-903** **(** **(21) 2103-9600 R.:236 ** ***** [hidden email]<http://user/SendEmail.jtp?type=node&node=3771831&i=0> *
** **
P* **Antes de imprimir* *pense em sua responsabilidade e compromisso com o* *MEIO AMBIENTE* ****
** **
Esta mensagem, incluindo seus anexos, pode conter informacoes privilegiadas e/ou de carater confidencial, nao podendo ser retransmitida sem autorizacao do remetente. Se voce nao e o destinatario ou pessoa autorizada a recebe-la, informamos que o seu uso, divulgacao, copia ou arquivamento sao proibidos. ****
Portanto, se você recebeu esta mensagem por engano, por favor, nos informe respondendo imediatamente a este e-mail e em seguida apague-a.****
** **
*De:* [hidden email]<http://user/SendEmail.jtp?type=node&node=3771831&i=1>[mailto:[hidden email] <http://user/SendEmail.jtp?type=node&node=3771831&i=2>] *Em nome de *Pedro Rafael *Enviada em:* sexta-feira, 26 de agosto de 2011 16:34 *Para:* [hidden email]<http://user/SendEmail.jtp?type=node&node=3771831&i=3> *Assunto:* Re: [R-br] [Dúvida] Invocar funções C++ no R****
** **
Fiz um programa muito simples para entender. O programa simplesmente soma um número com outro e está abaixo:****
** **
/* INICIO */****
#include <R.h> ****
** **
/* Funcao Principal */ ****
void soma1(double *a, double *b, double *res) ****
{ ****
*res = *a + *b; ****
} ****
/* FIM */****
** **
Depois de gerar o arquivo soma1.dll fiz no R:****
** **
dyn.load("soma1.dll")****
soma2 <- function(a,b){****
.C("soma1", as.double(a), as.double(b), res = a + b)$res****
}****
** **
O programa está pensado corretamente? Aproveito para pedir desculpas por aperriar tanto vocês e batendo na tecla só nesse assunto.****
** **
Saudações,****
Pedro Rafael****
** **
** **
** **
Em 26 de agosto de 2011 12:37, beniltoncarvalho [via R-br] <[hidden email]<http://user/SendEmail.jtp?type=node&node=3771831&i=4>> escreveu:****
Depende apenas do que vc estiver fazendo. .Call() e' conveniente por retornar objetos ao R diretamente. O .C() e' legal pq vc pode pegar funcoes ja' prontas em C e apenas criar um wrapper (vide GSL). b ****
_______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3771222&i=0> 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.
**** ------------------------------
*If you reply to this email, your message will be added to the discussion below:*
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... ****
To unsubscribe from R-br, click here. ****
****
** **
-- Saudações,****
Pedro Rafael Diniz Marinho.****
** **
_______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3771831&i=5> 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.
------------------------------ If you reply to this email, your message will be added to the discussion below:
http://r-br.2285057.n4.nabble.com/R-br-Duvida-Invocar-funcoes-C-no-R-tp37681... To unsubscribe from R-br, click here<http://r-br.2285057.n4.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=3357982&code=cGVkcm8ucmFmYWVsLm1hcmluaG9AZ21haWwuY29tfDMzNTc5ODJ8NTAyMjI0MDYw>.
-- Saudações, Pedro Rafael Diniz Marinho.

Só imagino que vc não precise declarar o res como argum ento e consequentemente, ter que dizer que res = a + b 2011/8/26 Pedro Rafael <pedro.rafael.marinho@gmail.com>:
Fiz um programa muito simples para entender. O programa simplesmente soma um número com outro e está abaixo: /* INICIO */ #include <R.h> /* Funcao Principal */ void soma1(double *a, double *b, double *res) { *res = *a + *b; } /* FIM */ Depois de gerar o arquivo soma1.dll fiz no R: dyn.load("soma1.dll") soma2 <- function(a,b){ .C("soma1", as.double(a), as.double(b), res = a + b)$res } O programa está pensado corretamente? Aproveito para pedir desculpas por aperriar tanto vocês e batendo na tecla só nesse assunto. Saudações, Pedro Rafael

Funcoes via .C() nao retornam valores para o R por conta do sistema de garbage collection. 2011/8/26 Henrique Dallazuanna <wwwhsd@gmail.com>:
Só imagino que vc não precise declarar o res como argum ento e consequentemente, ter que dizer que res = a + b

Oi Pedro, e' isso mesmo. Inclusive, para o seu programa em particular, vc nao precisa desse include. Uma recomendacao apenas na nomenclatura, que facilita eu nao me confundir nas minhas coisas: - Sua funcao em C e' funcao1() Entao, e' comum usarmos nomes como: funcao1R() ou funcao1Wrapper() para fazer a chamada a partir do R... Isso e' so' pra gente nao esquecer que a funcao "de verdade" eh a funcao em C e q essa em R eh apenas um "enfeite" (no sentido de que nao faz "as contas" de verdade). b
participantes (6)
-
Benilton Carvalho
-
Cesar Rabak
-
Henrique Dallazuanna
-
Leandro Marino
-
Leandro Marino
-
Pedro Rafael