rel.mem <- function(nm) {
rm(nm)
}
I defined the above function rel.mem -- takes a single argument and passes it to rm
> ls
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 inherits = TRUE
to go up the call stack until you find somethingIn 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:
If you are using another function to find the global objects within your function such as ls()
, you must state the environment in it explicitly too:
rel_mem <- function(nm) {
# State the environment in both functions
rm(list = ls(envir = .GlobalEnv) %>% .[startsWith(., "plot_")], envir = .GlobalEnv)
}