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 :

Changement valeur variable impossible dans if/else


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Changement valeur variable impossible dans if/else
    Bonjour, je ne comprends tout simplement pas pourquoi ce code ne marche pas et j'aimerai qu'on m'explique car je ne vois pas où est le problème.
    b devrait prendre la valeur 5 mais à l’exécution du code b vaut toujours 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    x <- 1
    b <- 0
     
    Test <- function() {
      if (x == 1) {
        b <- 5
      }
     
      else {
        b <- 7
      }
    }
     
    Test()
    Merci

    Edit : j'aimerai aussi savoir pourquoi ce code ne stock aucune valeur dans nombre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Test <- function() {
      cat("Saisir nombre : ")
      nombre <- scan(n = 1, quiet = TRUE)
    }
     
    Test()

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 528
    Points
    528
    Par défaut
    Bonsoir,

    Il s'agit d'un problème de portée de la variable b qui n'était pas visible depuis la fonction Test. Pour qu'elle le soit il faut utiliser l'assignation <<- :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    x <- 1
    b <- 0
    Test <- function() {
      if (x == 1) {
        b <<- 5
      }
      else {
       b <<- 7
      }
    }
    Test()
    print(b)
    Sinon, une autre manière un peu plus élégante de procéder serait de passer un paramètre à la fonction Test et de récupérer le résultat.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci de ta réponse Canvas. Peux-tu développer la manière un peu plus élégante ?
    Et comment savoir lorsqu'il faut utiliser <<- à la place de <- ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 528
    Points
    528
    Par défaut
    Bonsoir,

    L'idée est ne pas utiliser de variable globale dans une fonction en faisant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    x <- 1
    b <- 0
    Test <- function(p) {
      if (p == 1) {
        return(5)
      }
      else {
       return(7)
      }
    }
     
    b <- Test(x)
    print(b)
    La valeur de x est passée en paramètre et la valeur de b est mise à jour par le retour de la fonction.

  5. #5
    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,

    Comme l'a dit Canvas c'est une histoire de portée des variables.
    Quand tu fais des opérations dans une fonction, les objets que tu crées dans cette fonction sont disponibles dans la fonction, on parle d'environnement, mais pas à l'extérieur de la fonction. Il y a une notion d’emboîtement de hiérarchie.
    Une fonction peut aller piocher un objet qui lui est manquant, ici b et x, dans un environnement hiérarchique supérieure.
    LA première chose que fait une fonction c'est qu'elle va regarder que dans son environnement il y a bien les objets dont elle a besoin. Ici elle n'a n'y "b" ni "x" puisque que cette fonction n'a pas d'arguments et que ces objets ne sont pas crées au coeur de la fonction. Du coup elle va regarder si "au dessus", dans l'environnement supérieur elle peut trouver "b" et "x". La fonction Test est dans l'environnement général, la ou sont stockés tous les objets que l'on crée dans la console. Du coup son environnement supérieur c'est l'environnement global et elle cherche dans cet environnement ces deux objets. Comme elle les trouve elle peut continuer ces exécutions.
    Par contre le b qu'elle modifie est une "version" de b interne à la fonction et non pas externe. Pour qu'il soit externe il faut soit écraser le b de l'environnement global via "<<-".
    Cette double flèche permet de modifier un objet qui est dans un environnement global.
    Ça fonctionnera ici parce que b est dans l'environnement global mais ce n'est pas une très bonne pratique.
    La simple flèche crée l'objet à l'endroit ou la flèche est placée, ici en interne de la fonction Test.

    Il vaut mieux "choisir" l'objet qu'on remplace par exemple avec quelque chose comme b <- Test(x).
    Il faut bien sur que la fonction Test prenne un argument et que tu lui amènes la valeur?
    Ca a plusieurs avantages, d'une part quand on lit le code on sait tout de suite comment la valeur de b a été générée. D'autre part ça permet de créer ou de modifier b dans l'environnement que l'on veut, par exemple dans des fonctions embôitées où autres.

    cdlt

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

Discussions similaires

  1. Valeur variable access dans mail
    Par marcel10 dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/02/2016, 09h23
  2. [AJAX] Changement valeur variable php (sujet connu)
    Par nouilletonne dans le forum jQuery
    Réponses: 26
    Dernier message: 26/10/2015, 10h09
  3. Réponses: 3
    Dernier message: 14/10/2013, 17h54
  4. [Toutes versions] Basculer valeur variable VBA dans JavaScript
    Par Antho87 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/08/2009, 15h27
  5. Changer valeur variable global dans une fonction callback
    Par bog333 dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 02/10/2008, 15h14

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