问题:如何控制用户定义功能的删除(和保存)?
到目前为止,我已经尝试过:
我得到了一个建议,在每个函数的开头加一个点[。],因为它被告知不要删除这些函数。经过测试后,该功能会删除,尽管会出现点点。
要求:
所有“非功能”都应由[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"
)
]
)
答案 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会话状态的唯一方法;其他所有方法都是容易出错的黑客,因为它们仅执行部分清除。
关于您所写内容的注释:
经过测试后,该功能会删除,尽管会出现点点。
它们不是-它们只是不可见;这就是前导点的作用。但是,此建议也使我感到不习惯,因为这是不必要的修改。