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?

DQdlM
la source

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"
Andrie
la source
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"
Rahul Premraj
la source
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

Sadegh
la source
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!

Talon
la source
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)
Aaron a laissé Stack Overflow
la source
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"
Peter Diakumis
la source
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
require(gdata)
keep(object_1,...,object_n,sure=TRUE)
ls()
houx
la source
1
Duplicata de la réponse de @Rahul Premraj .
hplieninger
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.

Grec001
la source
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)
  }

}
Griffith Feeney
la source
2

Pour conserver une liste de fichiers, on peut utiliser:

rm(list=setdiff(ls(), c("df1", "df2")))
Peter
la source
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)
}
pense
la source
1

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

rm(list = ls(pattern="[^df]"))
MCH
la source
1
# remove all objects but selected
rm(list = ls()[which("key_function" != ls())])
f0nzie
la source
-9

Ce qui suit supprimera tous les objets de votre console

rm(list = ls())
Vishnu Kumar
la source
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