@Mauro Sznelwar
Qual sistema operacional você esta usando?
Parece que o erro tem haver de estar faltando alguma coisa, o compilador de c++?
Eu uso o ubunto aqui, e ja veio junto o compilador, o compilador está instalado ae certinho?
Na verdade eu não entendo muito bem de rcpp, estou apenas testando, mas talvez seja algo nesse sentido o erro ae. Aqui funciona normal o codigo.


E o vetor.erase(n) não funcionou :(

Quando eu tentei assim, deu uma msg de erro:

library(Rcpp)
vetor<-sample(100)

> cppFunction("
+     NumericVector insertionsortRC(NumericVector vetor) {
+         int n = vetor.size();
+         double aux;
+         int i;
+         if(n>1) {
+             vetor.erase(n);
+             insertionsortRC(vetor);
+             aux=vetor[n-1];
+             i=n-1;
+             while(vetor[i-1]>aux && i>=0 ) {
+                 vetor[i]=vetor[i-1];
+                 i--;
+                 }
+             vetor[i]=aux;
+             }
+         return vetor;
+         }
+     ")
> insertionsortRC(vetor)
*** Error in `/usr/lib/R/bin/exec/R': malloc(): memory corruption: 0x098db548 ***

Ai eu pensei se tinha algo haver com o indice, ai tentei com n-1, assim no vetor.erase(n-1)

> vetor
  [1]  33  31  86  25  70  40  88  81  13  85  87  39  60  64  10  82  89  14  66  36  15  96  26
 [24]   4  54  29  83  55  68  91   6 100  51   7  53  99  65  23  94  57  90  32  47  16  50  28
 [47]   3  98  11  18  76  63  77  74  49   8  97  12  27  35  79  80  20  67  93   5  56   9  37
 [70]  24  92  69  38  44  17  46  43  34  19   2  95  72   1  61  41  62  22  42  21  84  48  78
 [93]  73  30  59  58  52  75  71  45

> insertionsortRC(vetor)
 [1] 3.607393e-313  3.300000e+01  3.100000e+01  8.600000e+01  2.500000e+01  7.000000e+01
 [7]  4.000000e+01  8.800000e+01  8.100000e+01  1.300000e+01  8.500000e+01  8.700000e+01
[13]  3.900000e+01  6.000000e+01  6.400000e+01  1.000000e+01  8.200000e+01  8.900000e+01
[19]  1.400000e+01  6.600000e+01  3.600000e+01  1.500000e+01  9.600000e+01  2.600000e+01
[25]  4.000000e+00  5.400000e+01  2.900000e+01  8.300000e+01  5.500000e+01  6.800000e+01
[31]  9.100000e+01  6.000000e+00  1.000000e+02  5.100000e+01  7.000000e+00  5.300000e+01
[37]  9.900000e+01  6.500000e+01  2.300000e+01  9.400000e+01  5.700000e+01  9.000000e+01
[43]  3.200000e+01  4.700000e+01  1.600000e+01  5.000000e+01  2.800000e+01  3.000000e+00
[49]  9.800000e+01  1.100000e+01  1.800000e+01  7.600000e+01  6.300000e+01  7.700000e+01
[55]  7.400000e+01  4.900000e+01  8.000000e+00  9.700000e+01  1.200000e+01  2.700000e+01
[61]  3.500000e+01  7.900000e+01  8.000000e+01  2.000000e+01  6.700000e+01  9.300000e+01
[67]  5.000000e+00  5.600000e+01  9.000000e+00  3.700000e+01  2.400000e+01  9.200000e+01
[73]  6.900000e+01  3.800000e+01  4.400000e+01  1.700000e+01  4.600000e+01  4.300000e+01
[79]  3.400000e+01  1.900000e+01  2.000000e+00  9.500000e+01  7.200000e+01  1.000000e+00
[85]  6.100000e+01  4.100000e+01  6.200000e+01  2.200000e+01  4.200000e+01  2.100000e+01
[91]  8.400000e+01  4.800000e+01  7.800000e+01  7.300000e+01  3.000000e+01  5.900000e+01
[97]  5.800000e+01  5.200000e+01  7.500000e+01

Ai não funcionou. Mandando o vetor e o n junto, tudo funcionava, então acho que estou realizando alguma operação errada na chamada recursiva ali.

Olhando a descrição do comando aqui:
http://www.cplusplus.com/reference/vector/vector/erase/

Ele diz que apaga da memoria o valor, então imagino que talvez esteja dando problema na volta da recursão. Acho que não é tão simples usar Rcpp quanto imaginava.
Quando no primeiro caso la ele diz "memory corruption: 0x098db548", esse é o endereço de memoria que eu usei errado não é?





Em 19 de outubro de 2013 01:35, Benilton Carvalho <beniltoncarvalho@gmail.com> escreveu:

vetor.erase(n)?

On Oct 17, 2013 4:39 PM, "Augusto Ribas" <ribas.aca@gmail.com> wrote:
Ola pessoal.

Eu estou com uma dificuldade em como fazer uma chamada recursiva usando o Rcpp.

Por curiosidade, eu estava fazendo alguns códigos aqui usando o Rcpp, só por experiencia.
Ai eu estava implementando o código para o insertion sort  (http://pt.wikipedia.org/wiki/Insertion_sort)

Minha duvida é a seguinte:

#Suponha que eu tenho um vetor qualquer:

vetor<-sample(100)
vetor

#Iterativamente, eu fiz um código para usar com o Rcpp assim:

library(Rcpp)

cppFunction("
    NumericVector insertionsortC(NumericVector vetor) {
        int n = vetor.size();

        double aux;
        int i , j;

        for(i=1;i<n;i++) {
            aux=vetor[i];
            j=i-1;
            while(j>=0 && vetor[j]>aux) {
                vetor[j+1]=vetor[j];
                j=j-1;
                }
            vetor[j+1]=aux;
            }
        return vetor;
        }
")


#Funcionou beleza. Ai eu fui tentar repetir a tentativa, recursivamente

cppFunction("
    NumericVector insertionsortRC(NumericVector vetor, int n) {

        double aux;
        int i;

        if(n>1) {
            insertionsortRC(vetor,n-1);
            aux=vetor[n-1];
            i=n-1;
            while(vetor[i-1]>aux && i>=0 ) {
                vetor[i]=vetor[i-1];
                i--;
                }
            vetor[i]=aux;
            }

        return vetor;
        }
    ")

#E assim funcionou blz, mas eu tive que começar a mandar o argumento n, 
#que é o tamanho do vetor

#o que eu queria é fazer algo aqui, na chamada recursiva

#insertionsortRC(vetor,n-1);

#sei la, se eu conseguir tirar o ultimo elemento, eu posso suprimir esse n-1
#Eu não entendo de Rcpp e C++ muito bem.
#Mas tem uma forma simples de mudar o tamanho do vetor, ou arrancar o ultimo elemento dele
#algo tipo vetor.pop()

#pra fazer a chamada ficar tipo
#vetor.pop();
#insertionsortRC(vetor);
#que ai no inicio da chamada eu uso o int n = vetor.size(); igual ao formato iterativo.
#Bem, espero não estar sendo muito confuso na pergunta e que a função funcione.
#Mas imagino que deve ser super simples isso.

Agradeço a atenção desde ja :)

--
Grato
Augusto C. A. Ribas
 

_______________________________________________
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.

_______________________________________________
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.



--
Grato
Augusto C. A. Ribas
 
Site Pessoal: http://recologia.com.br/
Github: https://github.com/Squiercg
Lattes: http://lattes.cnpq.br/7355685961127056