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 :

comprendre une ligne de code


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut comprendre une ligne de code
    Bonjour,

    Je suis bloqué sur une ligne de code. je ne comprends pas ce qu'elle fait !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	res = sapply(n:length(x), function(i, ...) FUN(x[(i - n + 1):i], ...))
    	if (!trim) 
    	{
    		res = c(rep(NA, (n - 1)), res)
    	}
    merci pour vos remarques

  2. #2
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bonjour,

    Il y a deux blocs d'instructions dans ton exemple.
    Pour rendre les choses un peu plus lisibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    res <- sapply(n:length(x),
                  function(i, ...)
              {
                  FUN(x[(i - n + 1):i], ...)
              })
     
    if (!trim) 
    {
    		res <- c(rep(NA, (n - 1)), res)
    }
    Le problème, c'est que pour le premier, il est impossible de dire ce que ça fait, ne sachant pas ce que fait la fonction FUN (ni d'ailleurs ce qu'il y a dans x et n).

    Pour le deuxième bloc également il faudrait savoir ce que représentent les variables.

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    voici toute la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #Def fonction de fenetre gilssante
    rollFun = function(x, n = 9, FUN, trim = TRUE, na.rm = FALSE,...){x = as.vector(x)
    if (na.rm) x = as.vector(na.omit(x))
    res = sapply(n:length(x), function(i, ...) FUN(x[(i - n + 1):i], ...))
    if (!trim) res = c(rep(NA, (n - 1)), res)
    res}

  4. #4
    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 ouinih,

    Tout d'abord, la fonction "rollFun" est-elle une fonction d'un package R (si oui, lequel)?

    Sinon, d'après ce que j'ai compris, c'est la fonction "sapply" qui vous pose problème, c'est bien cela?
    Alors, pour le morceau de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    res <- sapply(n:length(x),
                  function(i, ...)
                  {
                       FUN(x[(i - n + 1):i], ...)
                  })
    On prend le vecteur des éléments n à length(x) (= longueur du vecteur x), par exemple si n=9 et x a une longueur de 12, on va avoir le vecteur : 9 10 11 12 .
    Et on applique à chacun des éléments de ce vecteur (9 10 11 et 12 dans mon exemple) la fonction définit comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f<-function(i, ...)
    {
       FUN(x[(i - n + 1):i], ...)
    }
    Cette fonction est en fait la fonction "FUN" (en argument de ta fonction "rollFun") MAIS appliquée uniquement aux éléments de x compris entre le (i - n + 1)ème et le ième.

    Par exemple, si on reprend le cas où n=9 et x a 12 éléments.
    On va d'abord appliquer la fonction f pour i=9 ie. la fonction "FUN" va être appliquée pour x[ 9 - 9 + 1 ] = x[1] , x[2], ... , x[9], puis dans un second temps on va appliquer la fonction f pour i=10 ie. la fonction "FUN" va être appliquée pour x[ 10 - 9 + 1 ] = x[2] , x[3], ... , x[9], etc... jusqu'à i=12.

    Bien sûr, sans connaître plus de détails sur la fonction "FUN", difficile de savoir de quelle forme seront les résultats en sortie dans l'élément "res" (cela dit, au vue de la suite du code, je suppose qu'il s'agit d'un vecteur).
    Pour info, la fonction "sapply" retourne un vecteur ou une matrice.

    Voilà, j'espère que ceci vous éclairera un peu (mais pas sûr que ça soit bien clair, désolée :/ ). Sinon, pour plus d'infos sur la fonction "sapply", il est possible de jeter un oeil à son aide via ?sapply , et le mieux c'est de faire quelques tests sur des exemples basiques afin d'en comprendre le fonctionnement.


    Sinon, concernant l'autre morceau de code qui semblait vous poser problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!trim) 
    {
        res <- c(rep(NA, (n - 1)), res)
    }
    Ici on teste si l'élément "trim" est "FALSE" ( !trim = NON trim = [ trim == FALSE ] ), et si c'est le cas, on va ajouter un vecteur contenant (n-1) "NA" au début du vecteur "res" (obtenu précédemment).

    Voilà, en espérant que ceci vous aide un peu à avancer, sinon n'hésitez pas à poser d'autres questions, et si éventuellement vous avez un exemple concret sur lequel appliquer la fonction "rollFun", cela nous facilitera peut-être la tâche pour vous aider.
    Sur ce, bonne continuation


    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.

  5. #5
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    Bon pour l'explication du sapply, je me suis fait grillé
    Citation Envoyé par A. D. Voir le message
    Par exemple, si on reprend le cas où n=9 et x a 12 éléments.
    On va d'abord appliquer la fonction f pour i=9 ie. la fonction "FUN" va être appliquée pour x[ 9 - 9 + 1 ] = x[1] , x[2], ... , x[9], puis dans un second temps on va appliquer la fonction f pour i=10 ie. la fonction "FUN" va être appliquée pour x[ 10 - 9 + 1 ] = x[2] , x[3], ... , x[9], etc... jusqu'à i=12.
    Mais juste pour reformuler rapidement et plus dans la logique de R, je dirais que si

    Le sapply va donc appliquer cette recette pour chaque valeur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n:length(x) == c(9, 10, 11, 12)

  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 : 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
    Citation Envoyé par pitipoisson Voir le message
    Bon pour l'explication du sapply, je me suis fait grillé

    Mais juste pour reformuler rapidement et plus dans la logique de R, je dirais que si

    Le sapply va donc appliquer cette recette pour chaque valeur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n:length(x) == c(9, 10, 11, 12)

    C'est bien plus clair comme ça, j'avoue que c'était un peu dur de bon matin

    Merci pitipoisson


    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.

  7. #7
    Membre Expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Par défaut
    OK, c'est plus clair comme ça !

    Ce que fait cette fonction (comme le suggère d'ailleurs le commentaire), c'est d'appliquer une fonction (FUN) sur x, en appliquant une fenêtre glissante de largeur n.

    Par exemple pour le calcul d'une moyenne mobile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > x <- 1:5
    > 
    > rollFun(x, n=2, FUN=mean, trim=FALSE)
    [1]  NA 1.5 2.5 3.5 4.5
    Trim indique s'il faut ou non remplir les NAs au début (pas de moyenne mobile calculable sur les éléments 0 et 1 puisque le premier n'existe pas).
    Ensuite, la moyenne est faite sur 1 et 2, puis 2 et 3, etc.

    Le sapply revient en quelque sorte à faire une boucle for mais en nettement plus efficace.

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

Discussions similaires

  1. comprendre une ligne code
    Par ouinih dans le forum Langage
    Réponses: 1
    Dernier message: 01/12/2011, 16h23
  2. comprendre une partie de code
    Par menuge dans le forum Langage
    Réponses: 24
    Dernier message: 03/09/2006, 20h44
  3. [VB2005] conversion d'une ligne de code de C# > vers VB2005
    Par DonJR dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/07/2006, 23h08
  4. [Tableaux] Explication d'une ligne de code
    Par eXiaNazaire dans le forum Langage
    Réponses: 3
    Dernier message: 30/03/2006, 13h09
  5. PB sur une ligne de code
    Par romrai dans le forum Access
    Réponses: 2
    Dernier message: 22/02/2006, 11h27

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