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 d'une matrice par référence


Sujet :

R

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 28
    Points : 20
    Points
    20
    Par défaut Passage d'une matrice par référence
    Bonjour,

    Il semble que les matrices soient passées par valeur, et donc recopiées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    f = function(A) {
        A[1,1] = -1 ; A
    }
    M = matrix(runif(6),nrow=2) ; M[1,1]
    > 0.9621319
    (f(M))[1,1]
    > -1
    M[1,1]
    0.9621319
    Y a-t-il un moyen pour forcer le passage par référence ? (J'ai une fonction qui aimerait prendre deux matrices en paramètres, et être appelée très souvent )

    Merci d'avance.

  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 : 44
    Localisation : France, Finistère (Bretagne)

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

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

    Le moyen, c'est de passer le nom de l'objet et celui de l'environnement d'où tu appelles la fonction (ou bien un autre si besoin) et d'utiliser get et assign :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    M <- matrix(runif(6),nrow=2) ; M[1,1]
     
    f <- function(A, envir=parent.frame()) {
        ## print(envir)
        x <- get(A, envir=envir)
        x[1, 1] <- -1
        assign(A,  x, envir=envir)
    }
     
     
    f("M")
     
    M
    Note que c'est bien le nom de la matrice et non la matrice elle-même que tu dois passer en paramètre (ici, l'environnement par défaut suffit... mais, pour l'exemple, si t'appelles ta fonction f dans un sapply, faudrait mettre envir=parent.frame(2) si tu souhaites agir sur un objet de l'environnement d'où tu appelles le sapply, i.e. remonter de deux niveaux !)

    Note également qu'il n'est pas possible d'assigner directement une valeur à un seul élément de la matrice depuis la fonction (du moins pas à ma connaissance, si quelqu'un sait comment faire, je suis archi-prenneur).
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    ça semble parfait pour le cas qui m'intéresse, merci !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2015, 14h48
  2. Réponses: 10
    Dernier message: 25/05/2007, 17h05
  3. [Tableaux] passage d'une variable par référence
    Par grinder59 dans le forum Langage
    Réponses: 7
    Dernier message: 14/05/2007, 17h52
  4. Réponses: 11
    Dernier message: 21/05/2006, 14h39
  5. Passage d'un tableau par référence?
    Par sebduth dans le forum C
    Réponses: 9
    Dernier message: 16/07/2003, 18h32

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