Comment puis-je supprimer tous les objets sauf un de l'espace de travail dans R?


220

J'ai un espace de travail avec beaucoup d'objets et je voudrais supprimer tout sauf un. Idéalement, je voudrais éviter d'avoir à taper rm(obj.1, obj.2... obj.n). Est-il possible d'indiquer remove all objects but these ones?

Réponses:


374

Voici une construction simple qui le fera, en utilisant setdiff:

rm(list=setdiff(ls(), "x"))

Et un exemple complet. Exécutez cela à vos risques et périls - cela supprimera toutes les variables sauf x:

x <- 1
y <- 2
z <- 3
ls()
[1] "x" "y" "z"

rm(list=setdiff(ls(), "x"))

ls()
[1] "x"

8
La technique utilisée ici consiste à utiliser list = to rm, ce qui permet de passer un vecteur de caractères à rm au lieu d'une liste de noms.
Spacedman

53

L'utilisation de la keepfonction du gdatapackage est assez pratique.

> ls()
[1] "a" "b" "c"

library(gdata)
> keep(a) #shows you which variables will be removed
[1] "b" "c"
> keep(a, sure = TRUE) # setting sure to TRUE removes variables b and c
> ls()
[1] "a"

Je trouve que l'utilisation de "garder" de gdata semble avoir plus de sens et il est plus facile de se rappeler que toute la complexité de la commande dans la base R.
Darius

47

Je pense qu'une autre option est d'ouvrir l'espace de travail dans RStudio puis de changer la liste en grille en haut à droite de l'environnement (image ci-dessous). Cochez ensuite les objets que vous souhaitez effacer et enfin cliquez sur effacer.

entrez la description de l'image ici


3
De même, cliquez sur la zone Nom, qui sélectionne tous les fichiers, puis désélectionnez tous les fichiers que vous souhaitez conserver.
Stephen

27

Je viens de passer plusieurs heures à chercher la réponse à une question similaire mais légèrement différente - j'avais besoin de pouvoir supprimer tous les objets dans R (y compris les fonctions) à l'exception d'une poignée de vecteurs.

Une façon de procéder:

rm(list=ls()[! ls() %in% c("a","c")])

Où les vecteurs que je veux garder sont nommés «a» et «c».

J'espère que cela aidera toute personne recherchant la même solution!


11
Cela devrait également fonctionner rm(list=setdiff(ls(), c("a", "c"))), non? Voir la réponse de @ Andrie.
hplieninger

17

Pour conserver tous les objets dont les noms correspondent à un motif, vous pouvez utiliser grep, comme ceci:

to.remove <- ls()
to.remove <- c(to.remove[!grepl("^obj", to.remove)], "to.remove")
rm(list=to.remove)


6

Cela profite de ls()l' patternoption de, dans le cas où vous avez beaucoup d'objets avec le même motif que vous ne voulez pas conserver:

> foo1 <- "junk"; foo2 <- "rubbish"; foo3 <- "trash"; x <- "gold"  
> ls()
[1] "foo1" "foo2" "foo3" "x"   
> # Let's check first what we want to remove
> ls(pattern = "foo")
[1] "foo1" "foo2" "foo3"
> rm(list = ls(pattern = "foo"))
> ls()
[1] "x"

whoah, cela semble dangereux! Existe-t-il un moyen de tester le motif correspondant à un "écho" dans le shell?
DQdlM

1
Je suppose que la rmfonction doit toujours être utilisée avec précaution (plus encore dans le shell!). Voir ma modification pour une réponse à votre question.
Peter Diakumis


3

réfléchissons différemment, que se passe-t-il si nous voulons supprimer un groupe? essaye ça,

 rm(list=ls()[grep("xxx",ls())]) 

Personnellement, je n'aime pas trop de tableaux, de variables sur mon écran, mais je ne peux pas éviter de les utiliser. Je nomme donc les éléments temporaires commençant par "xxx", afin de pouvoir les supprimer une fois qu'ils ne sont plus utilisés.


2

À partir d'une fonction, rm tous les objets dans .GlobalEnv sauf la fonction

initialize <- function(country.name) {

  if (length(setdiff(ls(pos = .GlobalEnv), "initialize")) > 0) {
    rm(list=setdiff(ls(pos = .GlobalEnv), "initialize"), pos = .GlobalEnv)
  }

}

2

Pour conserver une liste de fichiers, on peut utiliser:

rm(list=setdiff(ls(), c("df1", "df2")))

1

Que dis-tu de ça?

# Removes all objects except the specified & the function itself.

rme <- function(except=NULL){
  except = ifelse(is.character(except), except, deparse(substitute(except)))
  rm(list=setdiff(ls(envir=.GlobalEnv), c(except,"rme")), envir=.GlobalEnv)
}

1

en supposant que vous souhaitez supprimer tous les objets sauf df de l'environnement:

rm(list = ls(pattern="[^df]"))

1
# remove all objects but selected
rm(list = ls()[which("key_function" != ls())])

-9

Ce qui suit supprimera tous les objets de votre console

rm(list = ls())

4
Tout d'abord, ce n'est pas ce qui a été demandé. Deuxièmement, toutes les façons possibles de le faire dans R ont été couvertes dans les réponses précédentes. Vous êtes les bienvenus pour aider les autres utilisateurs qui ont de nouvelles questions. Celui-ci a été résolu il y a déjà 6 ans, et cette solution est toujours d'actualité.
Joris Meys
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.