删除除函数以外的所有变量


113

我已经在R控制台中加载了不同类型的对象。我可以使用删除它们

rm(list=ls())

或仅使用删除函数(而不删除变量)

rm(list=lsf.str())

我的问题是:有没有办法删除除函数以外的所有变量

Answers:


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 2011年

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对象的代码进行了有趣的比较。(顺便提一下,如果我能从他们的文档中找出两者之间的区别,我会感到很惊讶)。
乔什·奥布莱恩

我总是使用class而不是typeof
RockScience

1

您可以使用以下命令清除所有变量。小心,因为它无法将变量取回。

rm(list=ls(all=TRUE))

1
高兴

我想我应该留个评论,因为它更多地是仅供参考。抱歉。
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

我写这是为了删除当前环境中函数以外的所有对象(使用的编程语言是IDE R-Studio中的R):

    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”必须是字符向量。

当前环境中位置i处的对象名称从ls()[i]返回,而对象本身从get(ls()[i])返回。因此,对象的类是从class(get(ls()[i]))返回的


请添加有关“当前环境”的更多信息,例如,这是shell还是某种编程语言
DiveIntoML
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.