Bonjour !

En commençant aujourd'hui à traiter pour de bon quelques données sous R (que je découvre ces temps-ci), j'ai eu à me demander s'il était possible d'allouer des noms dynamiques aux variables et de les traiter dynamiquement.
J'ai découvert avec joie que les fonctions assign(), eval() et as.name() permettaient ce genre de gymnastiques. Par exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
x=0;
for (i in c(1:12,'joker')){
    assign(paste('x',i,sep=''),i);
}
..me permet de créer rapidement 13 variables d'un coup que je peux ensuite appeler statiquement par leur nom :

..ou dynamiquement par le biais d'autres variables :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
eval(as.name(paste('x',i,sep='')))
[1] "joker"
.. bref, super !

Seulement voilà, il s'agit (comme souvent sous R) de gérer des objets data.frame, donc pas tout à fait des variables basiques. De façon dynamique, je peux :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
t=data.frame(test=c(2,1,3),retest=c(3,1,2));
i='t';
j='test';
- appeler un data.frame entier:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
eval(as.name(i))
  test retest
1    2      3
2    1      1
3    3      2
- appeler une colonne statique d'un data.frame dynamique :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
eval(as.name(i))$test
[1] 2 1 3
- appeler une colonne dynamique d'un data.frame statique :

- toujours plus fort : appeler une colonne dynamique d'un data.frame dynamique, ouh yeah !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
eval(as.name(i))[[j]]
[1] 2 1 3
- accéder aux noms des colonnes d'un data.frame dynamique :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
names(eval(as.name(i)))
[1] "test"   "retest"
- mieux encore : déclarer un data.frame dynamique !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
k='dyna';
assign(k,data.frame(dynatest='joli',dynaretest='pas mal'));
dyna
  dynatest dynaretest
1     joli    pas mal
MAIS.. ça commence à fâcher pour la suite de ce qu'on pourrait attendre ; je ne parviens pas à :

- déclarer des colonnes dynamiques :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
assign(k,data.frame(as.name(i)='joli',as.name(j)='pas mal'));
Erreur : '=' inattendu(e) dans "assign(k,data.frame(as.name(i)="
- modifier les colonnes statiques d'un data.frame dynamique :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
eval(as.name(i))$test=c('oh','oh','oh');
Erreur dans eval(as.name(i))$test = c("oh", "oh", "oh") :
impossible de trouver la fonction "eval<-"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
assign(eval(as.name(i))$test,c('oh','oh','oh'));
Erreur dans assign(eval(as.name(i))$test, c("oh", "oh", "oh")) :
premier argument incorrect
- modifier les noms d'un data.frame dynamique :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
names(eval(as.name(i)))=c('bitest','biretest');
Erreur dans names(eval(as.name(i))) = c("bitest", "biretest") :
impossible de trouver la fonction "eval<-"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
assign(names(eval(as.name(i))),c('bitest','biretest'));
Message d'avis :
In assign(names(eval(as.name(i))), c("bitest", "biretest")) :
seulement le premier élément est utilisé comme nom de variable
- même pas en modifier un seul !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
names(eval(as.name(i)))[1]='bitest';
Erreur dans names(eval(as.name(i)))[1] = 'bitest' :
impossible de trouver la fonction 'eval<-'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
assign(names(eval(as.name(i)))[1],'bitest');
t
  test retest
1    2      3
2    1      1
3    3      2
Bien sûr, c'est frustrant, ça paraît dommage de pas pouvoir aller jusque au bout de ces manips, dommage de n'avoir accès aux objets dynamiques qu'en mode "lecture", tout ça.. Mais c'est surtout bien handicapant pour la suite du code : impossible de manipuler des données dynamiques !
Sauriez vous si quelqu'un s'est déjà penché sur ce problème ? S'il existe une incohérence profonde entre mes désirs et les fondements de R qui m'interdit d'aller plus loin ? Si l'on peut contourner ces erreurs par d'autres chemins ?
Voilà tout, merci à vous !
^ ^




--
Iago-lito