【问题标题】:remove all variables except functions删除除函数之外的所有变量
【发布时间】:2023-03-22 03:55:01
【问题描述】:

我在 R 控制台中加载了不同类型的对象。 我可以使用

将它们全部删除
rm(list=ls())

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

rm(list=lsf.str())

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

【问题讨论】:

    标签: r caching


    【解决方案1】:

    这是一个删除所有对象除了函数的单行:

    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)
    • 太好了,谢谢。我已经注意到 .j 不受 ls() 影响,但可以解释一下。
    【解决方案2】:

    发布的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 的对象。 (顺便说一句,如果我能从他们的文档中找出这两者之间的区别,我会很高兴的)。
    • 我总是用 class 而不是 typeof
    【解决方案3】:

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

    rm(list=ls(all=TRUE))
    

    【讨论】:

    • 很高兴知道,但这不是问题
    • 我想我应该把它作为评论留下,因为它更像是一个仅供参考。对不起。
    【解决方案4】:

    这是一个非常方便的功能,我在某个地方找到并稍作调整。保存在目录中可能会很好。

    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
    

    【讨论】:

      【解决方案5】:

      我写这个是为了从当前环境中删除除函数之外的所有对象(使用的编程语言是 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])) 中返回的

      【讨论】:

      • 请添加更多关于“当前环境”的信息,例如这是 shell 还是某种编程语言
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2015-03-06
      相关资源
      最近更新 更多