IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Allocation d'une list en R


Sujet :

R

  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 50
    Par défaut Allocation d'une list en R
    Bonjour,
    Etant debutant en R j'ai plein de questions que j'espere vous pourfendrez

    1.j'aimerais savoir comment preallouer une liste que je vais remplir dans une boucle ?
    2. pour un vecteur je fais rep(NA,10) par exemple, y'a t'il mieux ?
    3.lorsqu'on veut ajouer en fin d'une liste qqchose, y'a t'il une bonne facon de proceder ?

    Merci beaucoup
    statquant

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 100
    Par défaut
    1. Bonne question, je cherche aussi…

    2. vector('numeric',length=10)

    3. ?append

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Par défaut
    Peut-être ceci :
    blabla<-function (x=c(i,j,k)) { # tu pré-alloues ici ?!
    for (i in ?) {
    Ta Boucle }
    }

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    blabla<-function(x=c(1,3,4)){
    for (i in 1:10) {
    x=x+2
    }
    print(x)
    }
    blabla()
    Je ne suis pas sûr de bien comprendre la question, dsl.

  4. #4
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Citation Envoyé par TimoP Voir le message
    1. Bonne question, je cherche aussi…
    Pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    n <- 10
    l <- lapply(1:n, function(x) NA)
    Citation Envoyé par TimoP Voir le message
    2. vector('numeric',length=10)
    ou plus compact

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut Pour les vecteurs...
    ...pas la peine de se casser la tête.

    Si la variable x existe, on peut utiliser x[10] même si la longueur de x est plus petite que 10. Si besoin R « remplit » les indices intermédiaires avec des NA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    > x <- NULL
    > x[10] = 1
    > x
     [1] NA NA NA NA NA NA NA NA NA  1
    Bref...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 100
    Par défaut Oui mais
    c'est moins propre…

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut Ben...
    ...c’est du R, quoi.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 100
    Par défaut
    Pas du tout d'accord

    on peut faire du R très propre, et dans ce cas ça tourne très vite et c'est très lisible…

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Pré-allouer un vecteur est en effet une très bonne habitude qui accélère le temps d’exécution.

    Cependant, au hasard, un bout de code comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x <- 0.2;
    for(i in 1:99) x[i+1] <- 4*x[i]*(1-x[i])
    plot(x)
    me paraît avoir une certaine élégance propre à R ; à la lecture, ça n’est pas moins élégant qu’une solution qui consisterait à créer un vecteur de longueur 100, à y recopier la valeur initiale, et ensuite seulement faire la boucle...

    C’est sans aucun doute plus lent à l’exécution. Je ne connais pas les « internals » de R mais je soupçonne qu’en fait il crée une nouvelle variable à chaque tour de boucle. Mais si on n’a besoin que de 100 valeurs, est-ce vraiment la peine de s’embêter ? ça va aller bien assez vite.

    La vitesse d’exécution de R est en effet satisfaisante, pour un langage interprété offrant une telle souplesse — il faut comparer ce qui est comparable. J’ai vu quelqu’un traduire en R un programme C, pour pouvoir ensuite le modifier plus facilement... je te laisse imaginer le résultat en termes de performances (et la déception du gars). Le guépard et le limaçon, fable sans morale.

  10. #10
    Ayest
    Invité(e)
    Par défaut Vitesse d'execution : éviter les boucles !
    Une règle d'or en R qui n'est pas évidente quand on vient d'un autre langage :
    Pour avoir un code efficace en terme d'éxécution en R : il faut absolument éviter les boucles.

    Remplacer par les fonctions : apply, lapply, tapply, sapply...

    Un petit code pour tester : on génère une matrice 10000x1000, et on compare le temps de calcul des moyennes par ligne à l'aide d'une boucle, ou à l'aide de la fonction apply :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    > n=10000
    > x=matrix(runif(n*1000),nrow=n)
     
    > moy=rep(NA,n)
    > system.time(for (i in 1:n) {moy[i]=mean(x[i,])})
       user  system elapsed 
       2.13    0.03    2.16 
    > system.time(apply(x,1,mean))
       user  system elapsed 
       1.64    0.07    1.82

Discussions similaires

  1. allocation de memoire d'une liste de struct
    Par virtuadrack dans le forum C
    Réponses: 4
    Dernier message: 16/01/2009, 23h36
  2. Faire une liste de device??
    Par jackjack dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h43
  3. Réponses: 4
    Dernier message: 24/04/2003, 22h28
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo