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.