Entfernen Sie alle Variablen außer Funktionen

113

Ich habe in eine R-Konsole verschiedene Arten von Objekten geladen. Ich kann sie alle mit entfernen

rm(list=ls())

oder entfernen Sie nur die Funktionen (aber nicht die Variablen) mit

rm(list=lsf.str())

Meine Frage ist: Gibt es eine Möglichkeit, alle Variablen außer den Funktionen zu entfernen?

RockScience
quelle

Antworten:

137

Hier ist ein Einzeiler, der alle Objekte außer Funktionen entfernt:

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

Es wird verwendet setdiff, um die Teilmenge von Objekten in der globalen Umgebung (wie von zurückgegeben ls()) zu finden, die keinen Modus haben function(wie von zurückgegeben lsf.str()).

Josh O'Brien
quelle
5
Wenn Sie auch Objekte entfernen möchten, deren Namen mit einem Punkt beginnen, verwenden Sie stattdessen rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien
1
Vielen Dank für diese Antwort. Darf ich wissen, was eine Periode ist?
RockScience
1
Sicher. Ein Punkt (in amerikanischem Englisch) ist ein anderer Name für einen Punkt, wie folgt: .Um zu sehen, wovon ich spreche, versuchen Sie.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien
grosses Dankeschön. Ich habe bereits bemerkt, dass .j nicht von ls () betroffen ist, konnte das aber erklären.
RockScience
7

Die setdiffAntwort ist nett. Ich dachte nur, ich würde diese verwandte Funktion posten, die ich vor einiger Zeit geschrieben habe. Seine Nützlichkeit liegt beim Leser :-).

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
quelle
1
Danke, dass du das gepostet hast. Dies ergibt einen interessanten Vergleich mit dem Code, für ls.str()den jedoch modeeher das als das typeofvon Objekten getestet wird . (Nebenbei bemerkt, ich werde verdammt sein, wenn ich den Unterschied zwischen diesen beiden aus ihrer Dokumentation herausfinden kann).
Josh O'Brien
Ich benutze immer Klasse anstelle von typeof
RockScience
1

Mit dem folgenden Befehl können Sie ALLE Variablen löschen. Seien Sie vorsichtig, da Sie Ihre Variablen nicht zurückerhalten können.

rm(list=ls(all=TRUE))
lwileczek
quelle
1
Gut zu wissen, aber das ist nicht die Frage
RockScience
Ich denke, ich hätte das als Kommentar hinterlassen sollen, da es eher ein FYI war. Es tut uns leid.
lwileczek
0

Hier ist eine ziemlich praktische Funktion, die ich irgendwo aufgegriffen und ein wenig angepasst habe. Könnte schön sein, im Verzeichnis zu bleiben.

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
quelle
0

Ich habe dies geschrieben, um alle Objekte außer Funktionen aus der aktuellen Umgebung zu entfernen (die verwendete Programmiersprache ist R mit 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

Anmerkungen-

Das Argument "list" in rm (list =) muss ein Zeichenvektor sein.

Der Name eines Objekts an Position i der aktuellen Umgebung wird von ls () [i] und das Objekt selbst von get (ls () [i]) zurückgegeben. Daher wird die Klasse eines Objekts von der Klasse zurückgegeben (get (ls () [i]))

GiantShoulder
quelle
Bitte fügen Sie weitere Informationen zur "aktuellen Umgebung" hinzu, z. B. ob es sich um eine Shell oder eine bestimmte Programmiersprache handelt
DiveIntoML