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?

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()).


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]))
}

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

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

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]))


Bitte fügen Sie weitere Informationen zur "aktuellen Umgebung" hinzu, z. B. ob es sich um eine Shell oder eine bestimmte Programmiersprache handelt
DiveIntoML
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.