2011-11-29 29 views
90

我已经在R控制台中加载了不同类型的对象。 我可以用删除除函数外的所有变量

rm(list=ls()) 

将它们全部删除或者(但不是变量)使用

rm(list=lsf.str()) 

我的问题是只删除功能: 是有没有办法删除除功能

所有变量

回答

102

这是一个单线程删除所有对象除了功能:

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

它使用setdiff找到全球环境的对象不具有模式function(由lsf.str()返回)

+5

如果您还想要删除的对象,其名称开头一段,用这个来代替: 'RM(名单= setdiff(LS(all.names = TRUE),lsf.str(all.names = TRUE)))' –

+1

非常感谢这个答案。我可以知道什么是一个时期? – RockScience

+1

当然。一段时间(美式英语)是点的另一个名称,如下所示:'.'要查看我在说什么,请尝试'.j < - 5; LS(); ls(all.names = TRUE)' –

7

张贴的setdiff答案是很好的子集(由ls()返回)。我只是想我会发布这个我写回来的相关函数。它的用处取决于读者:-)。

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'对象。 (在附注中,如果我能从他们的文档中找出这两者之间的差异,我会感到厌烦)。 –

+0

@MatthewLundberg,我总是用class而不是typeof – RockScience

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

,好主意。我更新了。 –

0

您可以使用以下命令清除所有变量。要小心,因为它不能让你的变量回来。

rm(list=ls(all=TRUE)) 
+0

很高兴知道,但这不是问题 – RockScience

+0

我想我应该把它作为评论,因为它更多的是一个供参考。抱歉。 – lwileczek