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:
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:
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:
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:
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:
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:
1 2
| eval(as.name(i))[[j]]
[1] 2 1 3 |
- accéder aux noms des colonnes d'un data.frame dynamique :
Code:
1 2
| names(eval(as.name(i)))
[1] "test" "retest" |
- mieux encore : déclarer un data.frame dynamique !
Code:
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:
assign(k,data.frame(as.name(i)='joli',as.name(j)='pas mal'));
Citation:
Erreur : '=' inattendu(e) dans "assign(k,data.frame(as.name(i)="
- modifier les colonnes statiques d'un data.frame dynamique :
Code:
eval(as.name(i))$test=c('oh','oh','oh');
Citation:
Erreur dans eval(as.name(i))$test = c("oh", "oh", "oh") :
impossible de trouver la fonction "eval<-"
Code:
assign(eval(as.name(i))$test,c('oh','oh','oh'));
Citation:
Erreur dans assign(eval(as.name(i))$test, c("oh", "oh", "oh")) :
premier argument incorrect
- modifier les noms d'un data.frame dynamique :
Code:
names(eval(as.name(i)))=c('bitest','biretest');
Citation:
Erreur dans names(eval(as.name(i))) = c("bitest", "biretest") :
impossible de trouver la fonction "eval<-"
Code:
assign(names(eval(as.name(i))),c('bitest','biretest'));
Citation:
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:
names(eval(as.name(i)))[1]='bitest';
Citation:
Erreur dans names(eval(as.name(i)))[1] = 'bitest' :
impossible de trouver la fonction 'eval<-'
Code:
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