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

时间:2019-01-09 12:56:19

标签: r

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

到目前为止,我已经尝试过:

我得到了一个建议,在每个函数的开头加一个点[。],因为它被告知不要删除这些函数。经过测试后,该功能会删除,尽管会出现点点。

要求:

  • 所有“非功能”都应由[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 个答案:

答案 0 :(得分:4)

您可以使用ls.str指定要查找的对象mode。这样,您可以从rm列表中排除函数。

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

但是,最好将函数形式化到软件包中,然后不必担心用rm删除它们。

答案 1 :(得分:2)

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

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"

答案 2 :(得分:2)

我强烈建议使用其他方法。不要部分删除对象,而应使用适当的范围。也就是说,不要在全局环境中定义不需要在其中定义的对象,而应在函数或local范围内定义它们。

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

如果您使用的是设计范围,则无需调用临时变量rm,因此不会出现问题。

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


关于您所写内容的注释:

  

经过测试后,该功能会删除,尽管会出现点点。

它们不是-它们只是不可见;这就是前导点的作用。但是,此建议也使我感到不习惯,因为这是不必要的修改。