【发布时间】:2023-03-22 03:55:01
【问题描述】:
我在 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() 返回)
【讨论】:
rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
. 要了解我在说什么,请尝试 .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=) 中的参数“list”必须是字符向量。
从 ls()[i] 返回当前环境位置 i 的对象名称,从 get(ls()[i]) 返回对象本身。因此对象的类是从 class(get(ls()[i])) 中返回的
【讨论】: