代码之家  ›  专栏  ›  技术社区  ›  Toolbox

删除对象期间,在全局环境中保留用户定义的函数

r
  •  1
  • Toolbox  · 技术社区  · 6 年前

    问题: 如何控制用户定义函数的删除(和保存)?

    到目前为止我所做的尝试:

    我得到了一个建议,在每个函数的开头加上一个点[]。当测试时,尽管以点为起点,功能仍会被删除。

    要求:

    • 所有“非功能”应由[RM]处理。

    • 由于自动化的原因,程序需要能够由R Base从终端触发。解决方案只在rstudio中工作是不够的。

    • 由于保持解决方案的标准化,因此要使用全球环境。

    • 如果可能,应该能够定义要保留/删除的函数。

    预期结果:

    • 不应删除示例中的任何函数。

    下面是示例代码:

    # Create 3 object variables.
    a <- 1
    b <- 2
    c <- 3
    
    # Create 3 functions.
    myFunction1 <- function() {}
    myFunction2 <- function() {}
    myFunction3 <- function() {}
    
    # Remove all from global.env.
    # Keep the ones specified below.
    rm(list = ls()[! ls() %in% c(
      "a",
      "c"
    )
    ]
    )
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Konrad Rudolph    6 年前

    我强烈推荐一种不同的方法。不要部分删除对象,而是使用适当的范围。也就是说,不要在全局环境中定义不需要在全局环境中定义的对象,在函数中定义它们,或者 local 范围代替。

    再往前走一步, functions.R 文件 不应该定义全局环境中的函数。相反,正如注释中建议的,它应该在专用环境中定义它们,您可以 attach ,如果方便的话。这实际上就是R包解决的问题。如果你觉得R包对你来说太重,我建议你用我的 {modules} 机制:它干净地实现了基于文件的代码模块。

    如果按设计使用范围界定,则无需调用 rm 在临时变量上,因此不会出现问题。

    如果你 真的? 想要一个干净的记录,重新启动r并重新执行脚本:这是一致地重置r会话状态的唯一方法;所有其他方法都是容易出错的黑客,因为它们只执行部分清理。


    关于您所写内容的注释:

    当测试时,尽管以点为起点,功能仍会被删除。

    他们不是“他们只是” 看不见的 这就是前导点的作用。然而,这个建议也让我觉得是一个不好的实践:这是一个不必要的黑客。

        2
  •  4
  •   James    6 年前

    你可以使用 ls.str 指定一个 mode 要查找的对象。使用此选项,可以从 rm 名单。

    rm(list=setdiff(ls(),ls.str(mode="function")))
    ls()
    [1] "myFunction1" "myFunction2" "myFunction3"
    

    但是,您最好在包中形式化您的函数,然后就不必担心用 RM .

        3
  •  2
  •   Roland    6 年前

    容易的。不要使用全球环境。

    myenv <- new.env()
    
    with(myenv,
           {
             # Create 3 object variables.
             a <- 1
             b <- 2
             c <- 3
           }
           )
    myenv$a
    #[1] 1
    
    # Create 3 functions.
    myFunction1 <- function() {}
    myFunction2 <- function() {}
    myFunction3 <- function() {}
    
    # Remove all from env.
    # Keep the ones specified below.
    rm(list = ls(envir = myenv)[! ls(envir = myenv) %in% c(
      "a",
      "c"
    )
    ], envir = myenv
    )
    
    ls(envir = myenv)
    #[1] "a" "c"