The quick answer is that you're in a different environment - essentially picture the variables in a box: you have a box for the function and one for the Global Environment. You just need to tell rm
where to find that box.
So
rel_mem <- function(nm) {
# State the environment
rm(list=nm, envir = .GlobalEnv )
}
x = 10
rel_mem("x")
Alternatively, you can use the pos
argument, e.g.
rel_mem <- function(nm) {
rm(list=nm, pos=1 )
}
If you type search()
you will see a vector of environments, the global is number 1
.
Another two options are
envir = parent.frame()
if you want to go one level up the call stack
- Use
inherits = TRUE
to go up the call stack until you find something
In the above code, notice that I'm passing the object as a character - I'm passing the "x"
not x
. We can be clever and avoid this using the substitute
function
rel_mem <- function(nm) {
rm(list = as.character(substitute(nm)), envir = .GlobalEnv )
}
To finish I'll just add that deleting things in the .GlobalEnv
from a function is generally a bad idea.
Further resources:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…