rel.mem <- function(nm) {
rm(nm)
}
Run Code Online (Sandbox Code Playgroud)
我定义了上面的函数rel.mem - 接受一个参数并将其传递给rm
> ls()
[1] "rel.mem"
> x<-1:10
> ls()
[1] "rel.mem" "x"
> rel.mem(x)
> ls()
[1] "rel.mem" "x"
Run Code Online (Sandbox Code Playgroud)
现在你可以看到我称之为rel.mem x没有被删除 - 我知道这是由于正在尝试rm的环境不正确.
对此有什么好处?
一个好的修复的标准:
笔记:
csg*_*pie 12
快速回答是您处于不同的环境中 - 实际上是在框中描绘变量:您有一个功能框和一个全局环境框.你只需要知道rm在哪里找到那个盒子.
所以
rel_mem <- function(nm) {
# State the environment
rm(list=nm, envir = .GlobalEnv )
}
x = 10
rel_mem("x")
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用pos参数,例如
rel_mem <- function(nm) {
rm(list=nm, pos=1 )
}
Run Code Online (Sandbox Code Playgroud)
如果键入,search()您将看到环境向量,全局为数字1.
另外两个选择是
envir = parent.frame() 如果你想在调用堆栈上升一级 inherits = TRUE上调调用堆栈,直到找到某些内容在上面的代码中,请注意我将对象作为一个字符传递 - 我正在传递"x"not x.我们可以聪明并使用该substitute功能避免这种情况
rel_mem <- function(nm) {
rm(list = as.character(substitute(nm)), envir = .GlobalEnv )
}
Run Code Online (Sandbox Code Playgroud)
要完成,我只想补充说,.GlobalEnv从函数中删除东西通常是个坏主意.
更多资源: