remover todas as variáveis, exceto funções

113

Eu carreguei em um console R diferentes tipos de objetos. Posso removê-los todos usando

rm(list=ls())

ou remova apenas as funções (mas não as variáveis) usando

rm(list=lsf.str())

Minha pergunta é: existe uma maneira de remover todas as variáveis, exceto as funções

RockScience
fonte

Respostas:

137

Aqui está um one-liner que remove todos os objetos, exceto as funções:

rm(list = setdiff(ls(), lsf.str()))

Ele usa setdiffpara encontrar o subconjunto de objetos no ambiente global (conforme retornado por ls()) que não têm modo function(conforme retornado por lsf.str())

Josh O'Brien
fonte
5
Se você também deseja remover objetos cujos nomes começam com um ponto, use o seguinte: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien
1
Muito obrigado por esta resposta. Posso saber o que é um período?
RockScience
1
Certo. Um ponto final (em inglês americano) é outro nome para um ponto, como este: .Para ver do que estou falando, tente.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien
ótimo obrigado. Já notei que .j não foi afetado por ls () mas poderia explicar isso.
RockScience
7

A setdiffresposta postada é boa. Eu apenas pensei em postar esta função relacionada que escrevi há um tempo. Sua utilidade fica por conta do leitor :-).

lstype<-function(type='closure'){ 
    inlist<-ls(.GlobalEnv)
    if (type=='function') type <-'closure'
    typelist<-sapply(sapply(inlist,get),typeof)
    return(names(typelist[typelist==type]))
}
Carl Witthoft
fonte
1
Obrigado por postar isso. É uma comparação interessante com o código para o ls.str()qual, no entanto, testa o modeem vez do typeofde objetos. (Em uma nota lateral, será certeiro se conseguir descobrir a diferença entre os dois de sua documentação).
Josh O'Brien
Eu sempre uso classe em vez de typeof
RockScience
1

Você pode usar o seguinte comando para limpar TODAS as variáveis. Tenha cuidado porque você não pode obter suas variáveis ​​de volta.

rm(list=ls(all=TRUE))
lwileczek
fonte
1
É bom saber, mas essa não é a questão
RockScience
Eu acho que deveria ter deixado isso como um comentário, já que era mais um FYI. Desculpe.
lwileczek
0

Aqui está uma função muito conveniente que peguei em algum lugar e ajustei um pouco. Pode ser bom manter no diretório.

list.objects <- function(env = .GlobalEnv) 
{
    if(!is.environment(env)){
        env <- deparse(substitute(env))
        stop(sprintf('"%s" must be an environment', env))
    }
    obj.type <- function(x) class(get(x, envir = env))
    foo <- sapply(ls(envir = env), obj.type)
    object.name <- names(foo)
    names(foo) <- seq(length(foo))
    dd <- data.frame(CLASS = foo, OBJECT = object.name, 
                     stringsAsFactors = FALSE)
    dd[order(dd$CLASS),]
}

> x <- 1:5
> d <- data.frame(x)
> list.objects()
#        CLASS       OBJECT
# 1 data.frame            d
# 2   function list.objects
# 3    integer            x 
> list.objects(env = x)
# Error in list.objects(env = x) : "x" must be an environment
Rich Scriven
fonte
0

Escrevi isso para remover todos os objetos, exceto funções do ambiente atual (a linguagem de programação usada é R com IDE R-Studio):

    remove_list=c()                             # create a vector

      for(i in 1:NROW(ls())){                   # repeat over all objects in environment
        if(class(get(ls()[i]))!="function"){    # if object is *not* a function
         remove_list=c(remove_list,ls()[i])     # ..add to vector remove_list
         }    
      }

    rm(list=remove_list)                        # remove all objects named in remove_list

Notas-

O argumento "lista" em rm (lista =) deve ser um vetor de caracteres.

O nome de um objeto na posição i do ambiente atual é retornado de ls () [i] e o próprio objeto de get (ls () [i]). Portanto, a classe de um objeto é retornada da classe (get (ls () [i]))

GiantShoulder
fonte
Por favor, adicione mais informações sobre o "ambiente atual", por exemplo, se este é um shell ou alguma linguagem de programação
DiveIntoML