Я завантажив у консоль R об'єкти різного типу. Я можу видалити їх усіх за допомогою
rm(list=ls())
або видаліть лише функції (але не змінні), використовуючи
rm(list=lsf.str())
Моє запитання: чи є спосіб видалити всі змінні, крім функцій
Я завантажив у консоль R об'єкти різного типу. Я можу видалити їх усіх за допомогою
rm(list=ls())
або видаліть лише функції (але не змінні), використовуючи
rm(list=lsf.str())
Моє запитання: чи є спосіб видалити всі змінні, крім функцій
Відповіді:
Ось однолінійка, яка видаляє всі об'єкти, крім функцій:
rm(list = setdiff(ls(), lsf.str()))
Він використовує setdiff
для пошуку підмножини об'єктів у глобальному середовищі (повернених ls()
), які не мають режиму function
(як повертається lsf.str()
)
.
Щоб побачити, про що я говорю, спробуйте.j <- 5; ls(); ls(all.names=TRUE)
Опублікована setdiff
відповідь приємна. Я просто думав, що опублікую цю пов’язану функцію, яку я написав деякий час назад. Його корисність залежить від читача :-).
lstype<-function(type='closure'){
inlist<-ls(.GlobalEnv)
if (type=='function') type <-'closure'
typelist<-sapply(sapply(inlist,get),typeof)
return(names(typelist[typelist==type]))
}
ls.str()
якого, проте, тестується, mode
а не typeof
об'єктів. (Зі сторони, я буду зануджений, якщо зможу зрозуміти різницю між цими двома від їх документації).
Ось досить зручна функція, яку я десь підібрав і трохи відрегулював. Може бути приємно зберігати в каталозі.
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
Я написав це, щоб видалити всі об'єкти, крім функцій із поточного середовища (використовується мова програмування 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]))
rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))