rimuove tutte le variabili tranne le funzioni


113

Ho caricato in una console R diversi tipi di oggetti. Posso rimuoverli tutti usando

rm(list=ls())

oppure rimuovere solo le funzioni (ma non le variabili) utilizzando

rm(list=lsf.str())

La mia domanda è: c'è un modo per rimuovere tutte le variabili tranne le funzioni

Risposte:


137

Ecco una riga che rimuove tutti gli oggetti ad eccezione delle funzioni:

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

Utilizza setdiffper trovare il sottoinsieme di oggetti nell'ambiente globale (come restituito da ls()) che non hanno modalità function(come restituito da lsf.str())


5
Se desideri rimuovere anche gli oggetti i cui nomi iniziano con un punto, usa invece questo: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien

1
Grazie mille per questa risposta. Posso sapere cos'è un periodo?
RockScience

1
Sicuro. Un punto (in inglese americano) è un altro nome per un punto, come questo: .Per vedere di cosa sto parlando, prova.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien

ottimo grazie. Ho già notato che .j non è stato influenzato da ls () ma ho potuto spiegarlo.
RockScience

7

La setdiffrisposta pubblicata è carina. Ho solo pensato di pubblicare questa funzione correlata che ho scritto tempo fa. La sua utilità spetta al lettore :-).

lstype<-function(type='closure'){ 
    inlist<-ls(.GlobalEnv)
    if (type=='function') type <-'closure'
    typelist<-sapply(sapply(inlist,get),typeof)
    return(names(typelist[typelist==type]))
}

1
Grazie per averlo postato. Rappresenta un interessante confronto con il codice per il ls.str()quale, tuttavia, verifica gli oggetti modepiuttosto che quelli typeof. (In una nota a margine, sarò dannato se riesco a capire la differenza tra questi due dalla loro documentazione).
Josh O'Brien

Uso sempre class invece di typeof
RockScience

1

È possibile utilizzare il seguente comando per cancellare TUTTE le variabili. Fai attenzione perché non puoi recuperare le tue variabili.

rm(list=ls(all=TRUE))

1
Buono a sapersi, ma non è questo il problema
RockScience

Immagino che avrei dovuto lasciarlo come commento poiché era più di un FYI. Scusate.
lwileczek

0

Ecco una funzione piuttosto comoda che ho raccolto da qualche parte e regolato un po '. Potrebbe essere carino tenerlo nella directory.

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

0

Ho scritto questo per rimuovere tutti gli oggetti tranne le funzioni dall'ambiente corrente (il linguaggio di programmazione utilizzato è R con 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

Appunti-

L'argomento "list" in rm (list =) deve essere un vettore di caratteri.

Il nome di un oggetto nella posizione i dell'ambiente corrente viene restituito da ls () [i] e l'oggetto stesso da get (ls () [i]). Pertanto la classe di un oggetto viene restituita dalla classe (get (ls () [i]))


Si prega di aggiungere ulteriori informazioni sull '"ambiente corrente", ad esempio se si tratta di shell o di un determinato linguaggio di programmazione
DiveIntoML
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.