web-dev-qa-db-fra.com

Imprimer tous les objets dans un espace de travail

Je ne parviens pas à savoir comment répertorier et imprimer tous les objets d'un espace de travail. J'aimerais les voir tous et comprendre ce qui se passe. Par exemple, ls() vous donne 30 objets. Comment, en plus de les taper individuellement, est-il possible de les afficher tous. Cela semble si trivial que la solution sera probablement assez embarrassante. Le plus proche que je suis venu était ls.str() et l'idée de faire une boucle sur les objets.

Edit : Ce n'est pas pour les trames de données. J'ai un espace de travail plein de fonctions, sans données, et j'aime comprendre lesquelles font référence à quoi etc.

15
Rico

Voulez-vous dire 'afficher' dans le sens de "pour chaque objet dans ls(), je veux voir ce que je verrais si je le tapais dans l'invite"? Que faire si vous avez une matrice 1000x10000 - vous voulez toujours l’imprimer? Personnellement, j'aime bien ls.str() - je pense que cela donne une vue d'ensemble concise de Nice et traite le cas que je viens de mentionner.

Cependant, si vous voulez "afficher" chaque objet dans le sens de sa saisie dans l'invite, je suggérerais une boucle:

for ( obj in ls() ) { print(get(obj)) }

Puisque ls() renvoie un vecteur de caractères contenant des noms de variables, je dois utiliser get(obj) pour obtenir la variable dont le nom est dans obj.

Vous voudrez peut-être en faire une variante afin d’imprimer également le nom de la variable, par exemple. 

for ( obj in ls() ) { cat('---',obj,'---\n'); print(get(obj)) }

Par exemple:

> a <- 1
> b <- LETTERS[1:10]
> c <- data.frame(a=LETTERS[1:10],b=runif(10))
> for ( obj in ls() ) { cat('---',obj,'---\n'); print(get(obj)) }
--- a ---
[1] 1
--- b ---
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
--- c ---
   a         b
1  A 0.1087306
2  B 0.9577797
3  C 0.8995034
4  D 0.1434574
5  E 0.3548047
6  F 0.1950219
7  G 0.1453959
8  H 0.4071727
9  I 0.3324218
10 J 0.4342141

Cela a toutefois un inconvénient - la prochaine fois que vous appelez ls(), il y a maintenant une obj dans celle-ci. Je suis sûr qu'il existe une solution de contournement cependant.

Quoi qu'il en soit, je pense que je préfère toujours ls.str() pour la façon dont il gère les gros objets (mais je travaille avec beaucoup de matrices énormes (des millions d'éléments), c'est donc ma préférence).

28

Je trouve que l'utilisation de RStudio me permet d'avoir une vue de tous les objets de l'environnement et d'interagir directement avec chacun d'eux. Je suis sûr qu'un bon IDE permettra le type d'exploration que votre question semble nécessiter. Cela serait particulièrement utile pour vous donner une vue sur un grand nombre d'objets.

9
gauden

Faites-moi confiance: vous ne voulez vraiment pas imprimer tout le contenu de tous vos objets. Imaginez simplement imprimer matrix(1:1e5,100,1000) :-(. Il existe des outils R utiles tels que summary, table et str qui en disent généralement assez sur un objet de données pour que vous sachiez ce que c'est et ce que vous voulez en faire. .] Si vous avez des préoccupations plus spécifiques, par exemple "Lesquels de mes cadres de données ont-ils une valeur NA?", Vous pouvez écrire des commandes ou des mini-fonctions pour effectuer la recherche.
J'en ai écrit quelques-unes avec des noms tels que lstype(objtype='closure'), qui répertorie tous les objets du type désigné. 

6
Carl Witthoft

Si vous voulez juste les noms des variables que vous utilisez: 

ls()

Si vous souhaitez également imprimer vos variables avec le contenu, utilisez la commande suivante:

mget(ls())

Cela devrait faire ce dont vous avez besoin.

Pour un espace de travail récemment ouvert avec des matrices, des vecteurs et des trames de données, cela fonctionne bien pour moi.

3
Cynclida

Si vous avez un ou plusieurs objets volumineux dans votre espace de travail (vecteurs, matrices et/ou listes, par exemple), le bit de code suivant devrait vous donner une sortie compacte.

for ( obj in ls() ) { 
  cat('---',obj,'---\n');
  if ( class(get(obj)) == 'matrix'  ){
    print( get(obj)[1:min(ncol(get(obj)),10),1:min(ncol(get(obj)),10)] ) 
  }else if ( class(get(obj)) == 'numeric' |  class(get(obj)) == 'integer'  ){
    print( get(obj)[1:min(length(get(obj)),10)] )
  }else if( class(get(obj)) == 'list'){
    for (i in 1:length(get(obj))){
      if ( class(get(obj)) == 'matrix'  ){
        print( get(obj)[[i]][1:min(ncol(get(obj)[[i]]),10),1:min(ncol(get(obj)[[i]]),10)] ) 
      }else if ( class(get(obj)[[i]]) == 'numeric' |  class(get(obj)[[i]]) == 'integer'  ){
        print( get(obj)[[i]][1:min(length(get(obj)[[i]]),10)] )
      }else{
        print( get(obj)[[i]] ) 
      } 
    }
  }else{
    print( get(obj) ) 
  }
}
0
Philip Maybank