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 :

Création et incrément d'un nom de variable dans une boucle for - R


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Création et incrément d'un nom de variable dans une boucle for - R
    Bonjour,

    Débutante en R, je souhaite réaliser une boucle for dans laquelle le nom de mes variables dépend de mon incrément, et dans la boucle je réalise des opérations avec ces variables. (par ex, pour ce cas l'utilisation de paste ne fonctionnera pas)
    données:
    une db.class appelée grid, dans laquelle j'ai par ex 6 variables (dans la réalité j'en ai 300, d'où l'utilisation de ma boucle for):
    simu1, simu2, simu3, result1, result2, result3
    je souhaite créer des nouvelles variables dans cette db.class telles que:
    test1=simu1+result1
    en utilisant la fonction db.add

    d'avance merci bcp pour votre aide!!

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    Pourquoi dans le cas que tu indiques la fonction paste ou sprintf ne pourrait pas marcher ?

    cdlt

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    j'ai essayé la fonction paste mais dans le db.add elle ne fonctionne pas car elle ne reconnaît pas les noms de variables comme étant des variables justement, sur lesquelles on peut faire des opérations.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    est-ce que tu peux nous donner la commande que tu utilises et la librairie dont tu te sers ?

    après tu peux te servir de fonction comme eval, parse, subsitute pour recréer une ligne de commande et l'évaluer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(parse(text = sprintf("add.db(test%d = simud%d + result%d)", 1, 1, 1)))
    cdlt

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Oui alors je travaille sous RGeostat, qui utilise le code de R.
    ma fonction est la 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    test=db.create(nx=c(200,100)) # je créé ma db.class test
    panel_test=db.create(nx=c(20,10),dx=c(10,10)) # je crée une 2ème db.class
    test=db.add(test,Calorific) # je créé mes deux variables (dans mon il s'agissait de test; sauf qu'ici j'en ai deux)
    test=db.add(test,Accu)
     
    # ici je vais récupérer depuis 3 autres db.class des variables; toutes incrémentées de 1 à 4
    for (i in 1:4){
    test=db.grid.copy(simu100_thickness,test,names=paste("Simu.Thickness.S",i,sep="")) 
    }
    for (i in 1:4){
    test=db.grid.copy(simu100_A0,test,names=paste("A0.Accumulation.S",i,sep=""))
    }
    for (i in 1:4){
    test=db.grid.copy(simu100_A1,test,names=paste("A1.Accumulation.S",i,sep=""))
    }
     
    # là, je réalise mes calculs en écrasant à chaque fois mes variables Accu et Calorific
    for (i in 1:4){
    test[,5]=test[,i+9]+test[,i+13]
     
    test[,4]=test[,5]%/%test[,i+5]
     
    # sauf qu'avant de les écraser j'aimerais les copier dans une variable incrémentée et c'est là que mon paste ne fonctionne pas...
    test_panel=db.stat.grid(test,panel_test,fun="mean",names="Calorific") # ça c'est juste une fonction qui me permet de récupérer pour chaque panel composé de 100 points la moyenne de Calorific de ces 100 points. Ma variable de sortie s'appelle Stats.Calorific
     
    test_panel=db.add(test_panel,paste("MeanCalorific",1,sep="")=Stats.Calorific) # et là c'est le bout de ma fonction qui ne fonctionne pas... qu'à la base j'aurais bien utilisée dès le début pour avoir des Accu1, Accu2, Calorific1, Calorific2, etc...
     
    }
    D'avance merci beaucoup.

  6. #6
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    bonjour,

    tu peux remplacer la ligne de commande qui ne va pas par celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(parse(text = sprintf("test_panel=db.add(test_panel,%s=Stats.Calorific)", paste("MeanCalorific",1,sep=""))))
    Après il faudra peut-être jouer avec les notions d'environnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(parse(text = sprintf("test_panel=db.add(test_panel,%s=Stats.Calorific)", paste("MeanCalorific",1,sep=""))), envir = .GlobalEnv)
    La logique du truc c'est que tu utilises les fonctions paste, sprintf etc. pour écrire la ligne de commande que tu souhaites mais sous forme de chaines de caractères, ensuite tu transformes cette chaîne de caractère en expression avec la fonction parse et enfin tu executes cette expression avec la fonction eval.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    com <- sprintf("test_panel=db.add(test_panel,%s=Stats.Calorific)", paste("MeanCalorific",1,sep=""))
    expr <- parse(text = com)
    eval(expr)
    cdlt

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Je pense qu'il y a moyen de faire quelque chose de plus propre qu'avec eval avec la fonction do.call().

  8. #8
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    J'aime bien l'expression plus 'propre', je ne savais pas l'eval sale :-)

    Je suis preneur d'un exemple, parce que j'utilise fréquemment do.call mais dans ce cas précis je n'y arrive pas.
    Merci

    cdlt

  9. #9
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Est-ce que ceci peut fonctionner ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l1 <- list(test_panel, quote(Stats.Calorific))
    names(l1)[2] <- paste("MeanCalorific",1,sep="")
    test_panel <- do.call(add.db, l1)
    C'est plus "propre" en terme de script mais pas d'objet parce qu'on est obligé de passer par une liste intermédiaire.
    Bref j'ai pas mieux.

    cdlt

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    @tototode: C'est plus où moins le code que j'avais en tête, je n'avais pas le temps de l'écrire au moment où j'ai posté. En espérant que ça marche.

    Au niveau de la "propreté" c'est surtout que dans d'autres langages (js, php, C#...) l'utilisation d'eval est généralement déconseillée quand on peut faire autrement, pour des raisons de performances, sécurité, comportement inattendu, difficulté de débogage etc. En R ces problèmes se posent un peu moins.

Discussions similaires

  1. Noms des variables dans une boucle SAS
    Par Imfafa dans le forum Débutez
    Réponses: 13
    Dernier message: 26/05/2011, 13h42
  2. changer le nom des variables dans une boucle
    Par bakaratoun dans le forum MATLAB
    Réponses: 3
    Dernier message: 05/02/2010, 13h50
  3. [MySQL] Des noms de variables dans une boucle
    Par nicolas2603 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/08/2009, 14h51
  4. [Débutant] Nom de variable dans une boucle
    Par el cascador dans le forum MATLAB
    Réponses: 10
    Dernier message: 17/04/2009, 13h23
  5. Nom de variable dans une boucle
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2008, 16h24

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