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 :

manipulation des trois points de suspension comme paramètre formel


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut manipulation des trois points de suspension comme paramètre formel
    Bonjour,
    j'ai une fonction f ayant '...' comme paramètre formel Je voudrais que cette fonction retourne une liste dont les éléments sont les paramètres éffectifs reçus à l'appel, mais présentés de la mamière suivante:
    1) tout paramètre effectif passé sous la forme f( , v, ) où v est une variable du programme se présente sous la forme v=v dans la liste de sortie, autrement dit je voudrais obtenir une liste de sortie list( , v=v, ), dans laquelle le nom v de la variable devient le nom d'un élément dont la valeur est la valeur de v.
    2) tout autre parmètre effectif (qu'il soit passé sous la forme f( , nom=valeur, ) ou simplement f( , valeur, ) reste inchangé dans la liste de sortie

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    > w<-c(2,4,6,8,10,12,14)
    > x<-c("a","b") 
    > y<-1:3
    > z<-f(p1=7, w, p2=x, c(1,4,9), y)
    Dans cet exemple, l'appel à f me sort une liste référencée par la variable z. Je voudrais donc avoir:
    z$p1 vaut 7,
    z$w vaut c(2,4,6,8,10,12,14),
    z$p2 vaut c("a","b")
    z[[4]] vaut c(1,4,9)
    et z$y vaut 1:3
    autrement dit z <- list(p1=7, w=w, p2=x, c(1,4,9), y=y)

    Comment coder la fonction f?
    Merci de votre aide

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Bonjour,

    Voici une première piste qui ne répond pas entièrement à ta question mais apporte un début de réponse :

    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
    > w<-c(2,4,6,8,10,12,14)
    > x<-c("a","b") 
    > y<-1:3
     
     
    > f<-function(...)
    {
    	args<-list(...)
    	args
    }
     
    > z<-f(p1=7, w, p2=x, c(1,4,9), y)
     
     
    > z$p1
    [1] 7
    > z$w
    NULL
    > z$p2
    [1] "a" "b"
    > z[[4]]
    [1] 1 4 9
    > z$y
    NULL
     
    > z[[2]]
    [1] 2 4 6 8 10 12 14
    > z[[5]]
    [1] 1 2 3
    Peut-être qu'en bidouillant pour récupérer les noms des éléments en entrée (w, y) on peut obtenir ce que tu souhaites. A voir...

    Pour info, le livre cité dans un des posts récents : "R in a nutshell" contient une partie très intéressante sur la création de fonctions (dispo sur google books pour info).


    Bonne continuation

    A.D.


    [EDIT] Cela dit, il suffit que l'utilisateur spécifie les noms qui l'intéressent lors de l'appel de la fonction (par exemple : w=w, y=y ...), après cela dépend quelle est l'utilisation souhaitée de la fonction.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    merci AD pour ta réponse. Tu disais: "Peut-être qu'en bidouillant pour récupérer les noms des éléments en entrée (w, y) on peut obtenir ce que tu souhaites."
    Eh bien c'est justement ce bidouillage que je recherche. La demande sous-jacente à ma question est de savoir comment récupérer, par programmation, la référence vers un objet? Autrement dit, étant donné un objet X (que ce soit un paramètre effectif fourni ou non par l'utilisateur, une variable ou tout autre objet du programme), comment programmer l'obtention de "X" comme étant le string désignant la référence vers l'objet X?
    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    voici le genre de bidouillage qui peut répondre à la question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    f<- function(...) {
     
        args<- list(...)
        aname <- sapply(as.list(substitute({...})[-1]), deparse)     
        names(args) <- aname
        args
    }
    Voici quelques exemples:
    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
     
     
    > x <- runif(5)
    > y <- "abc"
    > f(x, y)
     
    $x
    [1] 0.44241647 0.07540958 0.46405311 0.01684738 0.94370893
     
    $y
    [1] "abc"
     
    > f(x, 1:3, y)
     
    $x
    [1] 0.44241647 0.07540958 0.46405311 0.01684738 0.94370893
     
    $"1:3"
    [1] 1 2 3
     
    $y
    [1] "abc"
     
    > f(abc=x, y)
     
    $x
    [1] 0.44241647 0.07540958 0.46405311 0.01684738 0.94370893
     
    $y
    [1] "abc"
    Merci

  5. #5
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Par défaut
    Plutôt chouette comme utilisation, c'est bon à savoir

    Cordialement,

    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  6. #6
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 74
    Par défaut
    comment programmer l'obtention de "X" comme étant le string désignant la référence vers l'objet X?
    Ben tu peut utiliser les fonctions et Par exemple on peut code la somme dans une fonction et faire apparaitre les chiffres rentré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mafonction <- function(x, y) {
        paste("la somme de", deparse(substitute(x)), "et", deparse(substitute(y)), "est :", x + y)
    }
    R> mafonction(2,4)
    [1] "la somme de 2 et 4 est : 6"
    Et puis si tu veux des truc plus complexe, regarde les fonctions du même type, quote, bquote, etc

Discussions similaires

  1. Signification des trois points dans un code
    Par deubelte dans le forum Débuter
    Réponses: 5
    Dernier message: 19/03/2010, 15h45
  2. l'utilisation des trois points
    Par mess-mate dans le forum C++
    Réponses: 8
    Dernier message: 13/12/2008, 15h11
  3. Réponses: 22
    Dernier message: 03/01/2008, 22h42
  4. Réponses: 2
    Dernier message: 18/12/2007, 10h03
  5. Manipuler des TDateTime comme des entiers?
    Par toufou25 dans le forum C++Builder
    Réponses: 8
    Dernier message: 22/06/2006, 15h52

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