[Dúvida] Invocar funções C++ no R

Como se procede para importar uma função C++ ou até mesmo C para o R? -- Saudações, Pedro Rafael Diniz Marinho - Estatístico SES-PB Currículo Lattes: http://buscatextual.cnpq.br/buscatextual/visualizacv.jsp?id=K4250792T6

Sua funcao C++ precisa estar contida numa chamada extern... extern "C" { void suaFuncao () ...... } Depois de compila-la, vc a chama com .C() Sua funcao em C nao precisa do wrapper e pode ser compilada diretamente e chamada via .C(). Para detalhes e tambem exemplos, veja o capitulo 5 do manual Writing R Extensions. Nao faz muito tempo, eu postei aqui um link para um material que tambem inclui exemplos de uso de codigo C em R... e inclui outra opcao de chamada, .Call(). b

Obrigado Benilton pela ajuda. Vou dar uma olhada no material do CRAN e tentar encontrar o material que você postou aqui na comunidade. Saudações, Pedro Rafael Diniz Marinho Em 25 de agosto de 2011 10:19, beniltoncarvalho [via R-br] < ml-node+3768192-710127126-223914@n4.nabble.com> escreveu:
Sua funcao C++ precisa estar contida numa chamada extern...
extern "C" { void suaFuncao () ...... }
Depois de compila-la, vc a chama com .C()
Sua funcao em C nao precisa do wrapper e pode ser compilada diretamente e chamada via .C().
Para detalhes e tambem exemplos, veja o capitulo 5 do manual Writing R Extensions.
Nao faz muito tempo, eu postei aqui um link para um material que tambem inclui exemplos de uso de codigo C em R... e inclui outra opcao de chamada, .Call().
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3768192&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 - Estatístico SES-PB Currículo Lattes: http://buscatextual.cnpq.br/buscatextual/visualizacv.jsp?id=K4250792T6

Procure pelo thread chamado: "Pacotes e C, Fortran ou outros".

To olhando o exemplo abaixo: void convolve(double *a, int *na, double *b, int *nb, double *ab) { R_len_t i, j, nab = *na + *nb - 1; for(i = 0; i < nab; i++) ab[i] = 0.0; for(i = 0; i < *na; i++) for(j = 0; j < *nb; j++) ab[i + j] += a[i] * b[j]; } called from R by conv <- function(a, b) .C("convolve", as.double(a), as.integer(length(a)), as.double(b), as.integer(length(b)), ab = double(length(a) + length(b) - 1))$ab Não estou conseguindo rodar. Devo gerar um arquivo .o ou o R tem algum compilador por trás para ler o código? Estou perdido :( Pedro Em 25 de agosto de 2011 10:39, beniltoncarvalho [via R-br] < ml-node+3768249-113061051-223914@n4.nabble.com> escreveu:
Procure pelo thread chamado: "Pacotes e C, Fortran ou outros". _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3768249&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 - Estatístico SES-PB Currículo Lattes: http://buscatextual.cnpq.br/buscatextual/visualizacv.jsp?id=K4250792T6

A primeira parte (tudo dentro do void convolve) e' uma funcao em C. Vc precisa te-la num arquivo como: convolve.c Depois, vc precisa ter compiladores C instalados no seu computador. Dai' compilar o codigo usando: R CMD SHLIB convolve.c Isso vai gerar um .so, que vc carregara' dentro do R usando dyn.load() Uma vez carregado no R, vc pode usar o .C(). Note que isso sera' um pouco mais complexo em Windows... E vc vai precisar instalar um bundle chamado RTools, possivelmente setar algumas variaveis de ambiente e substituir "R CMD" por Rcmd... mas isso, alguem q use Windows eh quem tem condicoes de explicar em detalhes. b

Consegui gerar o arquivo.so. Instalei o gcc no windows e pelo terminal deu para gerar o arquivo. O que seria o arquivo .so. Eu entendo que o arquivo .o é o código de máquina em que o compilador entendeu o código e gerou um arquivo legível pelo computador, mas o que seria o .so? Em 25 de agosto de 2011 11:06, beniltoncarvalho [via R-br] < ml-node+3768341-961603691-223914@n4.nabble.com> escreveu:
A primeira parte (tudo dentro do void convolve) e' uma funcao em C.
Vc precisa te-la num arquivo como: convolve.c
Depois, vc precisa ter compiladores C instalados no seu computador.
Dai' compilar o codigo usando: R CMD SHLIB convolve.c
Isso vai gerar um .so, que vc carregara' dentro do R usando dyn.load()
Uma vez carregado no R, vc pode usar o .C().
Note que isso sera' um pouco mais complexo em Windows... E vc vai precisar instalar um bundle chamado RTools, possivelmente setar algumas variaveis de ambiente e substituir "R CMD" por Rcmd... mas isso, alguem q use Windows eh quem tem condicoes de explicar em detalhes.
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3768341&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.

.o = object .so = shared object O .so eh uma biblioteca dinamica compartilhada.

Já gerei o arquivo (teste.so) mas quando vou ler no R dá o seguinte erro:
dyn.load("teste.so") Erro em inDL(x, as.logical(local), as.logical(now), ...) : impossível carregar objeto compartilhado 'C:/MinGW/bin/teste.so': LoadLibrary failure: %1 não é um aplicativo Win32 válido.
Em 25 de agosto de 2011 12:08, beniltoncarvalho [via R-br] < ml-node+3768514-1491010084-223914@n4.nabble.com> escreveu:
.o = object .so = shared object
O .so eh uma biblioteca dinamica compartilhada. _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3768514&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.

qual eh o caminho onde esta o teste.so? como vc gerou o teste.so? qual o conteudo do seu teste.c? e qual eh o resultado de getwd() dentro do R? b

por sinal, se vc estah em windows, eu esperaria que as bibliotecas geradas fossem DLLs ao inves de .so... mas, como eu disse anteriormente, minha experiencia com windows eh quase nula. b

Sim Benilton gerei o arquivo .so com o comando gcc -shared -o arquivo.so arquivo.o. O arquivo.c está localizado na pasta C:\MinGW\bin. Instalei o compilador MinGW!. Primeiramente gerei o executável e o arquivo .o, ou seja, arquivo.exe e arquivo.o. Para gerar os arquivos fui no terminal do Windows e caminhei até o diretório C:\MinGW\bin. Aí pude dar os dois comando: gcc -c arquivo.c e depois fiz gcc -shared -o arquivo.so arquivo.o. Pronto, o arquivo com extensão .SO foi gerado. Depois disso fui no R e mandei ele setar o diretório do arquivo.so que é C:\MinGW\bin, com o comando setwd('C:\\MinGW\\bin'). Depois para mim o que resta é ler o arquivo.so no R. Logo fiz o que segue abaixo e o erro ocorreu.
dyn.load("teste.so") Erro em inDL(x, as.logical(local), as.logical(now), ...) : impossível carregar objeto compartilhado 'C:/MinGW/bin/teste.so': LoadLibrary failure: %1 não é um aplicativo Win32 válido.
O conteúdo do arquivo.c é bem simples só fiz para testar e está logo abaixo: /* Programa: exfun.c Objetivo; Primeiro exemplo de uso de funcao Autor: Adriano Cruz Data: 12/10/97 */ #include<stdio.h> /* Prototipo da funcao */ int soma(int, int); /* Funcao Principal */ int main() { int a=5, b=9; printf("\n%d", soma(a,b)); getch(); return 0; } /* Definicao da funcao */ int soma(int a, int b) { return a+b; } Em 25 de agosto de 2011 15:54, beniltoncarvalho [via R-br] < ml-node+3769122-1021070905-223914@n4.nabble.com> escreveu:
qual eh o caminho onde esta o teste.so?
como vc gerou o teste.so?
qual o conteudo do seu teste.c?
e qual eh o resultado de getwd() dentro do R?
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3769122&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.

Voce vai precisar ler mesmo o material do manual e, para uma versao expressa, ver as notas de aula que postei no topico ao qual referi-me anteriormente. 1) Minha recomendacao (e de todo mundo que usa R+C) e' vc gerar a biblioteca usando: R CMD SHLIB arquivo.c 2) Quando o R conversa com o C, tudo o que o C enxerga sao ponteiros. Entao, toda a comunicacao C <-> R deve ser feita via ponteiros. Dito isso, seu programa precisa ser ligeiramente modificado: /* INICIO */ /* Programa: exfun.c Objetivo; Primeiro exemplo de uso de funcao Autor: Adriano Cruz Data: 12/10/97 */ #include<stdio.h> /* Prototipo da funcao */ int soma(int, int); /* Funcao Principal */ void fPrincipal(double *resultado) { int a=5, b=9; resultado[0] = soma(a,b); } /* Definicao da funcao */ int soma(int a, int b) { return a+b; } /* FIM */ Depois disso, compile-o usando: R CMD SHLIB arquivo.c (preste atencao qual arquivo sera' gerado, pq nao to muito certo de que em Windows sera' um .so, imagino que seja um DLL). Carregue o R e use: dyn.load("arquivo.dll") x = .C("fPrincipal", double(1)) Abaixo e' o q eu tenho:
dyn.load("teste.so") x = .C("fPrincipal", as.double(1)) x [[1]] [1] 14
O segundo argumento em .C() que vc ve, e' reservando, no R, memoria para 1 numero real, que o programa em C usa para gravar a resposta. b

Eu tava fazendo seguindo esse vídeo tutorial: http://www.youtube.com/watch?v=WIihUvQwYTA Em 25 de agosto de 2011 17:05, beniltoncarvalho [via R-br] < ml-node+3769255-1291827254-223914@n4.nabble.com> escreveu:
Voce vai precisar ler mesmo o material do manual e, para uma versao expressa, ver as notas de aula que postei no topico ao qual referi-me anteriormente.
1) Minha recomendacao (e de todo mundo que usa R+C) e' vc gerar a biblioteca usando:
R CMD SHLIB arquivo.c
2) Quando o R conversa com o C, tudo o que o C enxerga sao ponteiros. Entao, toda a comunicacao C <-> R deve ser feita via ponteiros.
Dito isso, seu programa precisa ser ligeiramente modificado:
/* INICIO */ /* Programa: exfun.c Objetivo; Primeiro exemplo de uso de funcao Autor: Adriano Cruz Data: 12/10/97 */ #include<stdio.h>
/* Prototipo da funcao */ int soma(int, int);
/* Funcao Principal */ void fPrincipal(double *resultado) { int a=5, b=9; resultado[0] = soma(a,b); }
/* Definicao da funcao */ int soma(int a, int b) { return a+b; }
/* FIM */
Depois disso, compile-o usando:
R CMD SHLIB arquivo.c
(preste atencao qual arquivo sera' gerado, pq nao to muito certo de que em Windows sera' um .so, imagino que seja um DLL).
Carregue o R e use:
dyn.load("arquivo.dll") x = .C("fPrincipal", double(1))
Abaixo e' o q eu tenho:
dyn.load("teste.so") x = .C("fPrincipal", as.double(1)) x [[1]] [1] 14
O segundo argumento em .C() que vc ve, e' reservando, no R, memoria para 1 numero real, que o programa em C usa para gravar a resposta.
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3769255&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.

Alguém tem experiência com desenvolvimento de R no Windows? Instalei o Rtools e adicionei as variáveis de ambientes. Estou conseguindo iniciar o R no DOS e também o gcc. Mas o Rtools não está conectado. Minha máquina é 64bits e o sistema é Windows 7. Em 25 de agosto de 2011 17:10, Pedro Rafael <pedro.rafael.marinho@gmail.com>escreveu:
Eu tava fazendo seguindo esse vídeo tutorial: http://www.youtube.com/watch?v=WIihUvQwYTA
Em 25 de agosto de 2011 17:05, beniltoncarvalho [via R-br] < ml-node+3769255-1291827254-223914@n4.nabble.com> escreveu:
Voce vai precisar ler mesmo o material do manual e, para uma versao
expressa, ver as notas de aula que postei no topico ao qual referi-me anteriormente.
1) Minha recomendacao (e de todo mundo que usa R+C) e' vc gerar a biblioteca usando:
R CMD SHLIB arquivo.c
2) Quando o R conversa com o C, tudo o que o C enxerga sao ponteiros. Entao, toda a comunicacao C <-> R deve ser feita via ponteiros.
Dito isso, seu programa precisa ser ligeiramente modificado:
/* INICIO */ /* Programa: exfun.c Objetivo; Primeiro exemplo de uso de funcao Autor: Adriano Cruz Data: 12/10/97 */ #include<stdio.h>
/* Prototipo da funcao */ int soma(int, int);
/* Funcao Principal */ void fPrincipal(double *resultado) { int a=5, b=9; resultado[0] = soma(a,b); }
/* Definicao da funcao */ int soma(int a, int b) { return a+b; }
/* FIM */
Depois disso, compile-o usando:
R CMD SHLIB arquivo.c
(preste atencao qual arquivo sera' gerado, pq nao to muito certo de que em Windows sera' um .so, imagino que seja um DLL).
Carregue o R e use:
dyn.load("arquivo.dll") x = .C("fPrincipal", double(1))
Abaixo e' o q eu tenho:
dyn.load("teste.so") x = .C("fPrincipal", as.double(1)) x [[1]] [1] 14
O segundo argumento em .C() que vc ve, e' reservando, no R, memoria para 1 numero real, que o programa em C usa para gravar a resposta.
b _______________________________________________ R-br mailing list [hidden email] <http://user/SendEmail.jtp?type=node&node=3769255&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 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.
participantes (2)
-
Benilton Carvalho
-
Pedro Rafael