видалити всі змінні, крім функцій


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)))
Josh O'Brien

1
Дякую за цю відповідь. Чи можу я знати, що таке період?
RockScience

1
Звичайно. Період (в американській англійській мові) - це ще одна назва крапки, як це: .Щоб побачити, про що я говорю, спробуйте.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien

чудово, дякую Я вже помітив, що .j не постраждав від ls (), але міг це пояснити.
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об'єктів. (Зі сторони, я буду зануджений, якщо зможу зрозуміти різницю між цими двома від їх документації).
Josh O'Brien

Я завжди використовую клас замість typeof
RockScience

1

Ви можете скористатися наступною командою для очищення ВСІХ змінних. Будьте уважні, тому що ви не зможете повернути свої змінні.

rm(list=ls(all=TRUE))


Я здогадуюсь, я мав би залишити це як коментар, оскільки це був більше FYI. Вибачте.
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.