rel.mem <- function(nm) {
rm(nm)
}
我定义了上面的函数rel.mem - 接受一个参数并将其传递给rm
> ls()
[1] "rel.mem"
> x<-1:10
> ls()
[1] "rel.mem" "x"
> rel.mem(x)
> ls()
[1] "rel.mem" "x"
现在你可以看到我所谓的rel.mem x没有被删除 - 我知道这是由于正在尝试使用rm的环境不正确。
对此有什么好的解决方法?
良好解决方案的标准:
注意:
答案 0 :(得分:12)
快速回答是您处于不同的环境中 - 实际上是在框中描绘变量:您有一个功能框和一个全局环境框。您只需要告诉rm
在哪里找到该框。
所以
rel_mem <- function(nm) {
# State the environment
rm(list=nm, envir = .GlobalEnv )
}
x = 10
rel_mem("x")
或者,您可以使用pos
参数,例如
rel_mem <- function(nm) {
rm(list=nm, pos=1 )
}
如果您输入search()
,您会看到一个环境向量,全局数字为1
。
另外两个选项是
envir = parent.frame()
如果你想在调用堆栈上升一级inherits = TRUE
上调调用堆栈直到找到在上面的代码中,请注意我将对象作为字符传递 - 我正在传递"x"
而不是x
。我们可以聪明并使用substitute
函数
rel_mem <- function(nm) {
rm(list = as.character(substitute(nm)), envir = .GlobalEnv )
}
要完成,我只想补充一点,从函数中删除.GlobalEnv
中的内容通常是糟糕的想法。
更多资源:
答案 1 :(得分:0)
如果您正在使用另一个函数在函数中查找全局对象,例如ls()
,则也必须在其中明确声明环境:
rel_mem <- function(nm) {
# State the environment in both functions
rm(list = ls(envir = .GlobalEnv) %>% .[startsWith(., "plot_")], envir = .GlobalEnv)
}