1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 2
    Points
    2

    Par défaut Error in t$g : object of type 'closure' is not subsettable

    Bonjour,
    je suis un débutant en programmation R. Je suis dans un projet en R pour créer une fonction capable de calculer des moyenne ,médiane ,écart type pour ensuite l'intégrer dans une application shiny.
    Mais j'ai tout le temps un message d'erreur dans ma fonction avec le mean (t$g):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     mean (t$g)
    > object of type 'closure' is not subsettable
    je sais pas comment faire pour résoudre ce probleme?

  2. #2
    Membre régulier
    Inscrit en
    février 2011
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 51
    Points : 96
    Points
    96

    Par défaut

    Bonjour,

    assure toi que l'objet 't' est bien été crée dans ta fonction. Si ce n'est pas le cas tu auras ce message d'erreur parce que t est aussi le nom d'une fonction disponible dans R. Si ton objet 't' n'est pas crée en interne de ta fonction alors il va chercher l'élément g de la fonction t et tu auras ce message. De manière générale on évite de donner pour nom d'objet des noms de fonctions déjà existantes. Plutôt t1 que t.

    cdlt

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Oui merci mais je sais plus comment créer le 't'?
    ci-joint mon code.
    Images attachées Images attachées  

  4. #4
    Membre régulier
    Inscrit en
    février 2011
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 51
    Points : 96
    Points
    96

    Par défaut

    le t est l'objet que tu passes à ta fonction, donc il te suffit de savoir sur quel objet tu veux appliquer cette fonction et de faire objet$g pour voir si cet élément ou cette colonne existe (remplace objet par le nom de l'objet sur lequel tu vas utiliser la fonction).

    cdlt

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    je vois pas trop ce que tu veux dire par là .Je peux avoir une illustration svp sur ce que je dois faire exactement.

  6. #6
    Membre régulier
    Inscrit en
    février 2011
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 51
    Points : 96
    Points
    96

    Par défaut

    Il te faut lire de la doc de base sur le logiciel. Une fonction, à un nom (la tienne calcul_dendro_lidar), des arguments (ce qui est entre paranthèse après function(...), toi c'est t) et tout corps (toutes les opérations qui sont réalisées dans la fonction).
    Par exemple si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f <- function(x) {
      x + 2
      }
    Le nom de la fonction c'est 'f' sont argument (il est unique ici mais il peut y en avoir plein) c'est "x" et le corps c'est x + 2.

    Une fonction est fait pour être appliquée sur des objets. Par exemple je crée un objet 'y' de type vecteur qui contient les nombres 1, 2, 3, 4 et 5 et je souhaite appliquer la fonction f sur cet objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    y <- c(1, 2, 3, 4, 5)
    f(y)
    [1] 3 4 5 6 7
    Qu'est-ce qui s'est passé ? A toutes les valeurs de l'objet y on a ajouté 2.
    Comment c'est possible ? La fonction f prend pour argument "x". Donc quand tu fais f(y), y devient le x de ta fonction et par la suite toutes les opérations que tu fais dans le corps de la fonction ce font sur x (x + 2 ici) parce que quand tu fais f(y) c'est comme tu écrivais f(x = y) et donc x est la copie conforme de y.

    Dans ta fonction à un moment tu fais comme opération mean(t$g), mais cette opération est réalisée à l'intérieur de la fonction. Donc elle va se faire sur l'objet que tu auras renseigné dans la ligne de commande calcul_dendro_lidar(objet).
    Example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    f <- function(t) {
      mean(t$g)
      }
     
    mean(t$g)
    Error in t$g : objet de type 'closure' non indiçable
    Ici le mean t$g n'a pas de sens parce qu'il est réalisé en dehors de la fonction et que l'on ne dispose pas d'un objet t.
    Par contre si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bob <- data.frame(g = c(1, 2, 3, 4, 5))
    bob
      g
    1 1
    2 2
    3 3
    4 4
    5 5
    'bob' est un objet de type data.frame qui a une colonne qui s'appelle g. Si je fais :Alors j'ai en fait écrit f(t = bob), donc à l'intérieur de la fonction f, t sera un objet de type data.frame qui a une colonne qui s'appelle g. Donc la fonction f va pouvoir calculer la moyenne de cette colonne.A l'intérieur de la fonction f il y a un objet t qui est la copie conforme de bob.
    Par contre à l'extérieur de cette fonction il n'y a pas d'objet qui s'appelle t donc si tu fais mean(t$g) tu auras le même message d'erreur que précédemment.

    J'espère que c'est assez clair.
    cdlt

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Bonjour,
    parfait c'est clair là j'ai bien compris.
    merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/02/2016, 16h57
  2. Réponses: 12
    Dernier message: 01/03/2012, 16h13
  3. object of type 'closure' is not subsettable
    Par foxley_gravity dans le forum R
    Réponses: 1
    Dernier message: 26/07/2011, 15h26
  4. [PHP 5.2] Fatal error: Cannot use object of type CPanier as array in . .
    Par Gauldo dans le forum Syntaxe
    Réponses: 10
    Dernier message: 12/01/2009, 14h53
  5. error setting property in bean of type null
    Par ouedmouss dans le forum JSF
    Réponses: 8
    Dernier message: 23/01/2007, 13h52

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