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 :

Passage par adresse


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut Passage par adresse
    Hum, désolé d’avoir une question RTFM, mais j’ai dû mal chercher...

    C’est possible pour une fonction de modifier un de ses arguments ?!

  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,

    Je crois deviner ce que tu veux dire, mais pourrais-tu être un peu plus précis sur les contraintes que tu as pour écrire ta fonction, le type d'objet à modifier, etc.

    Un petit exemple de test (au moins là où tu en es de tes recherches) serait un plus.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Eh bien, plus précisément... disons que j'ai ça :

    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
    step <- function(X)
    {
      n <- dim(X)[1];
      m <- dim(X)[2];
      repeat
      {
        I <- sample(1:n,2);
        J <- sample(1:m,2);
        if(X[I,J][2,1]>0 & X[I,J][1,2]>0)
        {
          X[I,J][2,1] <- X[I,J][2,1]-1;
          X[I,J][1,1] <- X[I,J][1,1]+1;
          X[I,J][1,2] <- X[I,J][1,2]-1;
          X[I,J][2,2] <- X[I,J][2,2]+1;
          break;
        } 
      }
      return(X);
    }
    Et je voudrais une fonction step2() qui ait la propriété suivante :
    step2(X) a le même effet que X <- step(X).

    (edit) mais enfin on s'en fiche, j’aurais pu tout simplement avoir bidule <- function(x) return(x+1); et demander une fonction bidule2() qui incrémente son argument.

  4. #4
    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
    Malheureusement - pour autant que je sache - on est obligé de passer par un stockage temporaire de la variable en raison des indices (j'ai jamais trouvé comment utiliser assign() pour des éléments d'une matrice).

    La solution est de passer le nom de l'objet (et éventuellement son environnement d'origine à la fonction :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    > a <- matrix(rep(0:3, 3), ncol=4)
    
    > a
         [,1] [,2] [,3] [,4]
    [1,]    0    3    2    1
    [2,]    1    0    3    2
    [3,]    2    1    0    3
    
    > step2 <- function(x, env=parent.frame())
    + {
    +     ## print(env)
    +     X <- get(x, envir=env)
    +     ## print(X)
    +     n <- dim(X)[1]
    +     m <- dim(X)[2]
    +     repeat
    +     {
    +         I <- sample(1:n, 2)
    +         J <- sample(1:m, 2)
    +         if(X[I, J][2, 1] > 0 & X[I, J][1, 2] > 0)
    +         {
    +             X[I, J][2, 1] <- X[I, J][2, 1] - 1
    +             X[I, J][1, 1] <- X[I, J][1, 1] + 1
    +             X[I, J][1, 2] <- X[I, J][1, 2] - 1
    +             X[I, J][2, 2] <- X[I, J][2, 2] + 1
    +             break
    +         }
    +     }
    +     assign(x, X, envir=env)
    + }
    
    > step2("a")
    
    > a
         [,1] [,2] [,3] [,4]
    [1,]    0    3    2    1
    [2,]    1    0    2    3
    [3,]    2    1    1    2

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Merci. Malheureusement je ne pense pas gagner en efficacité comme ça...

  6. #6
    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
    Effectivement tu ne gagnes ni en terme de mémoire ni en terme d'assignage de variable (lent).

    Il y a une autre façon de procéder, un peu plus compliquée, qui est basée sur le fait que les objets dans un environnement peuvent être indexés avec $ :
    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
     
    step2 <- function(x, env=parent.frame())
    {
        X <- paste("env$", x, sep="")
        repeat
        {
            I <- sample(1:nrow(get(x, envir=env)), 2)
            J <- sample(1:ncol(get(x, envir=env)), 2)
            if(get(x, envir=env)[I, J][2, 1] > 0 &
               get(x, envir=env)[I, J][1, 2] > 0)
            {
                ## print(paste(X, "[I, J][2, 1] <- ", X, "[I, J][2, 1] - 1", sep=""))
                eval(parse(text=paste(X, "[I, J][2, 1] <- ", X, "[I, J][2, 1] - 1", sep="")))
                eval(parse(text=paste(X, "[I, J][1, 1] <- ", X, "[I, J][1, 1] + 1", sep="")))
                eval(parse(text=paste(X, "[I, J][1, 2] <- ", X, "[I, J][1, 2] - 1", sep="")))
                eval(parse(text=paste(X, "[I, J][2, 2] <- ", X, "[I, J][2, 2] + 1", sep="")))
                break
            }
        }
    }
    Le principe est de construire une commande avec paste() (décommente la ligne print... pour un exemple) et de l'évaluer.
    Si tu travailles sur de grosses matrices et/ou que tu lances la routine un nombre élevé de fois, ça doit valoir le coup.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/12/2006, 17h46
  2. passage par adresse
    Par gloubig dans le forum C++
    Réponses: 1
    Dernier message: 20/05/2006, 06h35
  3. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29
  4. passage par adresse
    Par cari dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/02/2006, 11h33
  5. [Debutant(e)]passage par adresse?
    Par cap2fosse dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2004, 10h05

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