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 :

Types de paramètres passés à une fonction


Sujet :

R

  1. #1
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut Types de paramètres passés à une fonction
    Voici un exemple de fonction simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    essai <- function(Param) {
    if (Param != 0) {Param=Param*2}
    print(Param)
    }
    Pas de problème si j'appelle la fonction comme ceci essai(0) ou comme cela essai(1).
    Lorsque je l'appelle ainsi essai(c(3,7)) la fonction fonctionne, mais renvoie un warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Warning message:
    In if (Param != 0) { :
      the condition has length > 1 and only the first element will be used
    C'est encore le cas avec essai(matrix(1:6,nrow=2)).

    Ce warning semble contradictoire avec le résultat, puisqu'elle fait bien l'opération sur tous les éléments de l'objet transmis, et pas seulement sur le 1er
    Est-ce que quelqu'un saurait expliquer le pourquoi de ce warning ?

  2. #2
    Membre actif Avatar de Alpacky
    Homme Profil pro
    .
    Inscrit en
    Mars 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Mars 2014
    Messages : 99
    Points : 200
    Points
    200
    Par défaut
    Bonjour,

    le warning te préviens juste que pour le test de ta variable param dans le if, le test réalisé est équivalent à

    le test est appliqué uniquement sur le premier élément de ta variable

    cdt

  3. #3
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Alpacky Voir le message
    le test est appliqué uniquement sur le premier élément de ta variable
    C'est plutôt gênant qu'il exécute l'instruction pour tous les éléments, mais qu'il ne fasse le test que pour un seul.

    Est-ce qu'il faudrait insérer quelque chose comme for (i in seq(1:length(Param))) {if (Param != 0) {Param=Param*2}} ?

  4. #4
    Membre du Club
    Homme Profil pro
    Etudiant - Toulouse
    Inscrit en
    Avril 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant - Toulouse

    Informations forums :
    Inscription : Avril 2017
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Pense peut-être à ajouter une boucle for.
    Tu rentre en paramètre de ta fonction un array ou un vecteur
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    essai <- function(Param) {
       for i in 1:nrow(Param){
          if (Param[i] != 0) {
             Param[i]=Param[i]*2
          }
       print(Param[i])
       }
    }
    Mano

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    C'est logique ça marche comme ça. Dans ton exemple avec c(3,7) ça reviendrais à faire if(c(TRUE,TRUE)) ce qui n'a pas de sens.

    Une boucle for peut fonctionner effectivement (mais ton code a plusieurs problèmes)

    Cela dit c'est plus propre avec ifelse ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ifelse(Param != 0, 2*Param, NA)
    Ou encore comme ça si tu ne veux pas de NA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    2*Param[Param != 0]
    Mais dans ce dernier cas le vecteur retourné par ta fonction n'aura pas la même taille que le paramètre d'entrée ce qui ne sera pas forcément très intuitif à utiliser.

  6. #6
    Membre actif
    Inscrit en
    Novembre 2003
    Messages
    543
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 543
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Theta Voir le message
    2*Param[Param != 0]
    J'adopte votre dernière proposition.
    Merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/09/2009, 09h20
  2. type doublement paramétré dans une fonction
    Par merill dans le forum Langage
    Réponses: 2
    Dernier message: 08/04/2009, 12h54
  3. Réponses: 1
    Dernier message: 23/11/2007, 14h26
  4. Type de paramètre dans une fonction
    Par preempalver dans le forum Flash
    Réponses: 1
    Dernier message: 22/11/2007, 14h06
  5. Réponses: 11
    Dernier message: 06/09/2006, 12h48

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