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 :

apply sur une fonction qui renvoie une liste


Sujet :

R

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut apply sur une fonction qui renvoie une liste
    Bonjour,

    Je fais des calculs dans une fonction. Elle renvoit 2 sorties, abscisse et ordonnee, que je vais utiliser pour un graphique. J'utilise sapply sur cette fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    calcul_mean_median=function(donnees_exp1,k,res){
    moy=mean(as.numeric(donnees_exp1[k,]))
    mediane=median(as.numeric(donnees_exp1[k,]))
    abscisse=min(moy,mediane)/max(moy,mediane)
    ordonnee=max(res$resVarA[k],res$resVarB[k])
    return(list(abscisse=abscisse,ordonnee=ordonnee))
    }
     
    s_mean_median=sapply(i, function(k) {calcul_mean_median(donnees_exp1,k,res)})
    Mon problème est que je n'arrive plus à accéder à mes 2 champs en sorties. Mais je sais y accéder si je n'applique pas de sapply :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    > s_mean_median$
    + abscisse
    NULL
    > s_mean_median$
    s_mean_median$
     
    calcul_mean_median(donnees_exp1,1,res)
    $abscisse
    [1] 0.9496997
     
    $ordonnee
    [1] 0.1073555
    Comment faire pour régler ce problème ?
    Merci

  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 : 36
    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
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,


    Tout d'abord, si vous en avez la possibilité, il est toujours sympa d'ajouter un extrait de vos données (court mais représentatif) qui nous permette de faire tourner vos fonctions, cela fait gagner du temps à tout le monde.


    Deuxièmement, je ne comprends pas ce que représente le " i " lorsque vous écrivez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_mean_median=sapply(i, function(k) {calcul_mean_median(donnees_exp1,k,res)})
    De plus, il me semble qu'il y a d'autres petites erreurs dans le code que vous mettez en deuxième partie.


    Sinon, je pense que le "problème" vient en fait de l'utilisation de la fonction "sapply".
    En effet, cette fonction renvoie en sortie un vecteur ou une matrice, donc dans votre cas, si par exemple vous l'appliquer pour k=1:2, vous obtiendrez en sortie une matrice de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > s_mean_median
             [,1]    [,2]     
    abscisse 1.48347 0.7812197
    ordonnee 2       2
    D'où le fait que vous ne puissiez pas accéder à "s_mean_median$abscisse" par exemple.

    Si vous souhaitez obtenir en sortie une liste, il est préférable d'avoir recours à la fonction "lapply".
    Vous obtiendrez alors une sortie de la forme suivante :

    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
    > s_mean_median
    [[1]]
    [[1]]$abscisse
    [1] 1.48347
     
    [[1]]$ordonnee
    [1] 2
     
     
    [[2]]
    [[2]]$abscisse
    [1] 0.7812197
     
    [[2]]$ordonnee
    [1] 2
    Ensuite, pour accéder par exemple à l'élément "abscisse" pour le cas k=1, appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_mean_median[[1]]$abscisse

    En espérant que ceci réponde à votre question, bonne continuation


    Cordialement,

    A.D.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par A. D. Voir le message
    Bonjour,


    Tout d'abord, si vous en avez la possibilité, il est toujours sympa d'ajouter un extrait de vos données (court mais représentatif) qui nous permette de faire tourner vos fonctions, cela fait gagner du temps à tout le monde.
    Ok pour la prochaine fois

    Deuxièmement, je ne comprends pas ce que représente le " i " lorsque vous écrivez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_mean_median=sapply(i, function(k) {calcul_mean_median(donnees_exp1,k,res)})
    le i, c'est le k, qui varie effectivement de 1 à n...

    De plus, il me semble qu'il y a d'autres petites erreurs dans le code que vous mettez en deuxième partie.


    Sinon, je pense que le "problème" vient en fait de l'utilisation de la fonction "sapply".
    En effet, cette fonction renvoie en sortie un vecteur ou une matrice, donc dans votre cas, si par exemple vous l'appliquer pour k=1:2, vous obtiendrez en sortie une matrice de cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > s_mean_median
             [,1]    [,2]     
    abscisse 1.48347 0.7812197
    ordonnee 2       2
    D'où le fait que vous ne puissiez pas accéder à "s_mean_median$abscisse" par exemple.

    Si vous souhaitez obtenir en sortie une liste, il est préférable d'avoir recours à la fonction "lapply".
    Effectivement, j'ai simplement changé sapply en lapply et je peux accéder à mes différents champs. Merci !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    J'arrive à accéder à un des éléments de la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    s_mean_median[[1]]$abscisse
    [1] 0.9496997
    Mais je n'arrive pas à accéder à l'ensemble des valeurs contenues dans un des champs. Je ne suis pas trop habituée à travailler avec les listes, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    s_mean_median[[1:2]]$abscisse
    Erreur dans s_mean_median[[1:2]]$abscisse : 
      $ operator is invalid for atomic vectors
    > s_mean_median[[]]$abscisse
    Erreur dans s_mean_median[[]] : type 'symbol' d'indice incorrect
    > s_mean_median$abscisse
    NULL
    Je souhaite récupérer toutes les valeurs de chaque champ pour les tracer sur un graphe. Peut-être que la liste n'est pas la plus adaptée alors...

  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 : 36
    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
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Citation Envoyé par jane40 Voir le message
    Effectivement, j'ai simplement changé sapply en lapply et je peux accéder à mes différents champs. Merci !
    De rien


    Juste comme ça :

    Citation Envoyé par jane40 Voir le message
    le i, c'est le k, qui varie effectivement de 1 à n...
    Dans ce cas, écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_mean_median=sapply(1:n, function(k) {calcul_mean_median(donnees_exp1,k,res)})

    Bonne continuation


    Cordialement,

    A.D.

  6. #6
    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 : 36
    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
    Points : 2 673
    Points
    2 673
    Par défaut
    Re,
    Citation Envoyé par jane40 Voir le message
    Je souhaite récupérer toutes les valeurs de chaque champ pour les tracer sur un graphe. Peut-être que la liste n'est pas la plus adaptée alors...
    Je ne maîtrise pas parfaitement les listes, mais en effet, dans votre cas, si l'objectif final est de tracer un graphe avec les valeurs obtenues pour "abscisse" et "ordonnee", pourquoi ne pas utiliser la fonction "sapply"?
    Ensuite il sera possible de récupérer les abscisses en prenant : , et les ordonnées en prenant : Bonne continuation


    Cordialement,

    A.D.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Alors j'ai rechangé lapply en sapply et effectivement, j'ai accès à mes données via une matrice. Le seul "problème" qu'il reste est que les valeurs de cette matrice ne sont pas numériques (peut-être dû à la présence de NA), et c'est un peu pénible de forcer la conversion à chaque fois. Je vais commencer par enlever tous les NA...

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 05/02/2015, 14h47
  2. Réponses: 11
    Dernier message: 22/01/2014, 19h30
  3. Réponses: 6
    Dernier message: 16/01/2011, 15h33
  4. Ecrire une fonction qui renvoie une structure de données (type)
    Par dinosaure dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/09/2008, 20h59
  5. Fonction qui renvoie une liste
    Par la_praline dans le forum GTK+ avec C & C++
    Réponses: 20
    Dernier message: 20/04/2007, 21h22

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