usuń wszystkie zmienne z wyjątkiem funkcji


113

Załadowałem do konsoli R różnego typu obiekty. Mogę je wszystkie usunąć za pomocą

rm(list=ls())

lub usuń tylko funkcje (ale nie zmienne) za pomocą

rm(list=lsf.str())

Moje pytanie brzmi: czy istnieje sposób na usunięcie wszystkich zmiennych z wyjątkiem funkcji

Odpowiedzi:


137

Oto jedna linijka, która usuwa wszystkie obiekty z wyjątkiem funkcji:

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

Używa setdiffdo znalezienia podzbioru obiektów w środowisku globalnym (zwróconych przez ls()), które nie mają trybu function(zwróconych przez lsf.str())


5
Jeśli chcesz również usunąć obiekty, których nazwy zaczynają się od kropki, użyj tego zamiast: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien

1
Wielkie dzięki za tę odpowiedź. Czy mogę wiedzieć, co to jest okres?
RockScience

1
Pewnie. Kropka (w amerykańskim angielskim) to inna nazwa kropki, jak ta: .Aby zobaczyć, o czym mówię, spróbuj.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien

wielkie dzięki. Zauważyłem już, że ls () nie ma wpływu na .j, ale mogę to wyjaśnić.
RockScience

7

Wysłana setdiffodpowiedź jest miła. Pomyślałem, że opublikuję tę powiązaną funkcję, którą napisałem jakiś czas temu. Jego użyteczność zależy od czytelnika :-).

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

1
Dzięki za opublikowanie tego. Daje to interesujące porównanie z kodem, dla ls.str()którego jednak testuje moderaczej obiekty niż typeofobiekty. (Na marginesie, będę cholerny, jeśli uda mi się wyliczyć różnicę między tymi dwoma na podstawie ich dokumentacji).
Josh O'Brien

Zawsze używam class zamiast typeof
RockScience

1

Możesz użyć następującego polecenia, aby wyczyścić WSZYSTKIE zmienne. Uważaj, ponieważ nie możesz odzyskać zmiennych.

rm(list=ls(all=TRUE))

1
Dobrze wiedzieć, ale nie o to chodzi
RockScience

Myślę, że powinienem zostawić to jako komentarz, ponieważ była to bardziej informacja do Twojej wiadomości. Przepraszam.
lwileczek

0

Oto całkiem wygodna funkcja, którą gdzieś wybrałem i trochę dostosowałem. Dobrze byłoby trzymać się katalogu.

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

Napisałem to, aby usunąć wszystkie obiekty oprócz funkcji z bieżącego środowiska (używanym językiem programowania jest R z 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

Uwagi-

Argument "list" w rm (list =) musi być wektorem znakowym.

Nazwa obiektu na pozycji i obecnego środowiska jest zwracana z ls () [i], a sam obiekt z get (ls () [i]). Dlatego klasa obiektu jest zwracana z klasy (get (ls () [i]))


Proszę dodać więcej informacji o "aktualnym środowisku", np. Czy jest to powłoka czy określony język programowania
DiveIntoML
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.