Я загрузил в консоль 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
объекты, чем объекты. (Кстати, я буду проклят, если смогу понять разницу между этими двумя из их документации).
Вы можете использовать следующую команду, чтобы очистить ВСЕ переменные. Будьте осторожны, потому что вы не сможете вернуть свои переменные.
rm(list=ls(all=TRUE))
Вот довольно удобная функция, которую я где-то подобрал и немного поправил. Было бы неплохо оставить в каталоге.
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)))