【问题标题】:How do I manipulate the global environment inside a function in R?如何在 R 中的函数内部操作全局环境?
【发布时间】:2012-10-20 05:37:00
【问题描述】:

我想从当前环境中删除所有对象,除了其中两个,类似这样

rm(list=setdiff(ls(),c("current_object_a","current_object_b")))

但我想在函数中调用它。如果我现在这样做,什么都不会发生,因为我删除的是函数内部的环境变量,而不是全局环境。

【问题讨论】:

    标签: r


    【解决方案1】:

    您必须为lsrm 指定环境。

    rm(list = setdiff(ls(globalenv()),
                      c("current_object_a", "current_object_b")),
       pos = globalenv())
    

    但是,说真的,你为什么要这样做?从函数中删除全局环境中的内容似乎是一件坏事。

    【讨论】:

    • +1 用于识别ls 需要同时指定globalenv()
    • 我在 lib 目录中有一组 R 文件,我希望我的环境能够反映 lib 中的更改。如果我重命名一个函数,我想删除旧名称,所以我删除了除 rm 函数和 source_dir 函数(加载 lib 目录)之外的所有对象,然后我再次调用 rf() 加载它们(刷新)。有没有更好的方法来做到这一点? rf
    • 我很想知道是否有更好的方法
    • 我会创建一个新环境,将其附加到搜索路径,然后在该环境中进行所有操作。实际上,您正在创造自己的控制空间,因此您可以在其中添加(和破坏)而不受惩罚。在搜索路径上,您仍然可以访问这些对象,而无需指定环境。
    • @BrianDiggs 这正是devtools::load_all 的工作原理
    【解决方案2】:

    您可以使用posenvir 参数指定环境

    rm(list=setdiff(ls(pos=globalenv()),
                    c("current_object_a","current_object_b")), 
       pos=globalenv())
    

    来自?rm

    “pos”参数可以指定从哪个环境 以多种方式中的任何一种删除对象:作为整数( 在“搜索”列表中的位置);作为字符串名称 搜索列表中的元素;或作为“环境”(包括 使用“sys.frame”访问当前活动的函数调用)。 “envir”参数是指定 环境,但主要是为了向后兼容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-21
      • 2020-07-24
      • 2013-09-24
      • 2016-03-27
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多