Como posso remover todos os objetos, exceto um, da área de trabalho no R?


219

Eu tenho um espaço de trabalho com muitos objetos e gostaria de remover todos, exceto um. Idealmente, gostaria de evitar ter que digitar rm(obj.1, obj.2... obj.n). É possível indicar remove all objects but these ones?

Respostas:


373

Aqui está uma construção simples que fará isso, usando setdiff:

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

E um exemplo completo. Execute isso por sua conta e risco - ele removerá todas as variáveis, exceto x:

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

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

ls()
[1] "x"

8
A técnica usada aqui é usar list = to rm, que permite que um vetor de caracteres seja passado para rm em vez de uma lista de nomes.
Spacedman

53

Usar a keepfunção do gdatapacote é bastante conveniente.

> 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"

Acho que usar "keep" do gdata parece fazer mais sentido e é mais fácil lembrar que toda a complexidade do comando na base R.
Darius

47

Penso que outra opção é abrir o espaço de trabalho no RStudio e depois alterar a lista para grade no canto superior direito do ambiente (imagem abaixo). Marque os objetos que deseja limpar e, finalmente, clique em limpar.

insira a descrição da imagem aqui


3
Da mesma forma, clique na caixa Nome, que seleciona todos os arquivos e desmarque todos os arquivos que deseja manter.
Stephen

26

Passei várias horas procurando a resposta para uma pergunta semelhante, mas um pouco diferente - eu precisava ser capaz de excluir todos os objetos em R (incluindo funções), exceto alguns vetores.

Uma maneira de fazer isso:

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

Onde os vetores que eu quero manter são nomeados 'a' e 'c'.

Espero que isso ajude quem procura a mesma solução!


11
Isso também deve funcionar rm(list=setdiff(ls(), c("a", "c"))), certo? Veja a resposta de @ Andrie.
Hplieninger

17

Para manter todos os objetos cujos nomes correspondam a um padrão, você pode usar grepo seguinte:

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


6

Isso leva vantagem de ls()'s patternopção, no caso de você ter um monte de objetos com o mesmo padrão que você não deseja manter:

> 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, isso parece perigoso! Existe uma maneira de testar o padrão correspondente a um "eco" no shell?
DQdlM

1
Eu acho que a rmfunção sempre deve ser usada com cuidado (mais ainda no shell!). Veja minha edição para obter uma resposta para sua pergunta.
Peter Diakumis


3

vamos pensar de maneira diferente, e se quisermos remover um grupo? tente isso,

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

Pessoalmente, não gosto de muitas tabelas e variáveis ​​na tela, mas não consigo evitar usá-las. Por isso, nomeio as coisas temporárias que começam com "xxx", para poder removê-las depois que não forem mais usadas.


2

De dentro de uma função, rm todos os objetos em .GlobalEnv, exceto a função

initialize <- function(country.name) {

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

}

2

Para manter uma lista de arquivos, pode-se usar:

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

1

Que tal agora?

# 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

assumindo que você deseja remover todos os objetos, exceto o df do ambiente:

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

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

-9

A seguir, você removerá todos os objetos do seu console

rm(list = ls())

4
Primeiro de tudo, não foi isso que foi perguntado. Segundo, todas as formas possíveis de fazer isso em R foram abordadas nas respostas anteriores. Você pode ajudar outros usuários que tiverem novas perguntas. Este já foi resolvido há 6 anos e essa solução ainda existe hoje.
Joris Meys
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.