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 :

foreach( ) %do%


Sujet :

R

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut foreach( ) %do%
    Bonjour,

    Je suis entrain de tester la boucle foreach mais je bloque sur un petit exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    l <- list("a" = seq(1,10,1), "b" = seq(0,100,10))
    foreach(i = l, n = 1:length(l)) %do% 
    { 
      foreach(j = i) %do% 
      {
        if ("a" == names(l[n])) {j*2}
        if ("b" == names(l[n])) {j/2}
      } 
    }
    Ça me retourne NULL pour la première partie, je ne comprends pas pourquoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    [[1]]
    [[1]][[1]]
    NULL
     
    [[1]][[2]]
    NULL
     
    [[1]][[3]]
    NULL
     
    [[1]][[4]]
    NULL
     
    [[1]][[5]]
    NULL
     
    [[1]][[6]]
    NULL
     
    [[1]][[7]]
    NULL
     
    [[1]][[8]]
    NULL
     
    [[1]][[9]]
    NULL
     
    [[1]][[10]]
    NULL
     
     
    [[2]]
    [[2]][[1]]
    [1] 0
     
    [[2]][[2]]
    [1] 5
     
    [[2]][[3]]
    [1] 10
     
    [[2]][[4]]
    [1] 15
     
    [[2]][[5]]
    [1] 20
     
    [[2]][[6]]
    [1] 25
     
    [[2]][[7]]
    [1] 30
     
    [[2]][[8]]
    [1] 35
     
    [[2]][[9]]
    [1] 40
     
    [[2]][[10]]
    [1] 45
     
    [[2]][[11]]
    [1] 50

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    En fait ce n'est pas qu'il ne se passe rien, c'est qu'il n'est rien renvoyé. Comme dans une boucle ou dans une fonction, sans commande explicite ce qui est renvoyé c'est le résultat de la dernière commande, ici de if ("b" == names(l[n])) {j/2}. Dans la première partie de la boucle la condition "b" == names(l[n]) n'est pas vérifiée donc il ne se passe rien dans cette dernière commande et donc il n'est renvoyé. Dans la deuxième partie de la boucle par contre cette commande est vérifiée et le résultat est affichée.
    Pour s'en convaincre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    l <- list("a" = seq(1,10,1), "b" = seq(0,100,10))
    foreach(i = l, n = 1:length(l)) %do% 
    { 
      res <- integer(length(i[n]))
      u <- 1
      foreach(j = i) %do% 
      {
        if ("a" == names(l[n])) res[u] <- j*2
        if ("b" == names(l[n])) res[u] <- j/2
        u <- u+1
      }
      print(res) 
    }
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach(i = l, n = 1:length(l)) %do% 
    { 
      foreach(j = i) %do% 
      {
        if ("a" == names(l[n])) print(j*2)
        if ("b" == names(l[n])) print(j/2)
      } 
    }
    Avec ce dernier exemple on voit bien que l'execution se fait, on voit l'affichage du résultat dans la console grâce au print mais rien ne sera renvoyé pour la première partie de la seconde boucle parce que tu n'utilises pas a proprement parlé de fonction ou de structure pour renvoyer le résultat. Du coup le résultat renvoyé est celui de la dernière commande et comme pour la première partie cette dernière commande renvoie NULL alors tu as tous ces NULL.
    Une possibilité parmi tant d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach(i = l, n = 1:length(l)) %do% 
    { 
      foreach(j = i) %do% 
      {
        res <- if ("a" == names(l[n])) j*2
         else if ("b" == names(l[n])) j/2
         else NA
        res
      } 
    }
    Ici tu stockes le résultat dans un objet res, et la dernière execution de la boucle sur le j est de renvoyé le résultat contenu dans res. Du coup contrairement à ta boucle initiale le résultat est renvoyée par les deux boucles.

    J'espère que c'est plus clair.
    Cdlt

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    bonjour,

    merci de votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] foreach imbrique ?
    Par pascale86 dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2005, 12h04
  2. Foreach + switch
    Par mic79 dans le forum Langage
    Réponses: 12
    Dernier message: 12/10/2005, 16h36
  3. Réponses: 4
    Dernier message: 14/09/2005, 17h23
  4. [C#] ArrayList, foreach et suppression
    Par lalystar dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/04/2005, 11h42
  5. [langage] foreach, last et valeurs de sortie
    Par Herode dans le forum Langage
    Réponses: 6
    Dernier message: 01/04/2005, 14h37

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