удалить все переменные, кроме функций


113

Я загрузил в консоль R разные типы объектов. Я могу удалить их все, используя

rm(list=ls())

или удалите только функции (но не переменные), используя

rm(list=lsf.str())

Мой вопрос: есть ли способ удалить все переменные, кроме функций

Ответы:


137

Вот однострочник, который удаляет все объекты, кроме функций:

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

Он используется setdiffдля поиска подмножества объектов в глобальной среде (как возвращено ls()), у которых нет режима function(как возвращено lsf.str())


5
Если вы также хотите удалить объекты, имена которых начинаются с точки, используйте вместо этого: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Джош О'Брайен,

1
Большое спасибо за этот ответ. Могу я узнать, что такое период?
RockScience

1
Конечно. Точка (в американском английском) - еще одно название точки, например: .Чтобы понять, о чем я говорю, попробуйте.j <- 5; ls(); ls(all.names=TRUE)
Джош О'Брайен

отлично, спасибо. Я уже заметил, что ls () не влияет на .j, но могу это объяснить.
RockScience

7

Опубликованный setdiffответ хорош. Я просто подумал, что выложу эту связанную функцию, которую написал некоторое время назад. Его полезность зависит от читателя :-).

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

1
Спасибо, что разместили это. Это делает интересное сравнение с кодом, ls.str()который, однако, проверяет modeскорее typeofобъекты, чем объекты. (Кстати, я буду проклят, если смогу понять разницу между этими двумя из их документации).
Джош О'Брайен

Я всегда использую class вместо typeof
RockScience

1

Вы можете использовать следующую команду, чтобы очистить ВСЕ переменные. Будьте осторожны, потому что вы не сможете вернуть свои переменные.

rm(list=ls(all=TRUE))

1
Полезно знать, но вопрос не в этом
RockScience

Думаю, мне следовало оставить это как комментарий, так как это было больше для информации. Сожалею.
lwileczek

0

Вот довольно удобная функция, которую я где-то подобрал и немного поправил. Было бы неплохо оставить в каталоге.

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

Я написал это, чтобы удалить все объекты, кроме функций из текущей среды (используемый язык программирования - R с 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

Ноты-

Аргумент «список» в rm (list =) должен быть вектором символов.

Имя объекта в позиции i текущего окружения возвращается из ls () [i], а сам объект из get (ls () [i]). Следовательно, класс объекта возвращается из класса (get (ls () [i]))


Пожалуйста, добавьте дополнительную информацию о «текущей среде», например, является ли это оболочкой или определенным языком программирования
DiveIntoML
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.