编写一个函数来删除对象(如果存在)

时间:2011-08-24 08:29:59

标签: function r

我正在尝试编写一个删除对象的函数(如果存在)。原因是我想摆脱日志消息错误:找不到对象'arg'。我尝试了以下方法:

ifrm <- function(arg)
{
   if(exists(as.character(substitute(arg)))){rm(arg)}
}

不幸的是,如果该对象存在,则不会删除该对象

> ifrm <- function(arg)
+ {
+    if(exists(as.character(substitute(arg)))){rm(arg)}
+ }
> a <- 2
> ifrm(a)
> a
[1] 2

任何提示我在这里做错了什么?

最佳阿尔布雷希特

4 个答案:

答案 0 :(得分:8)

获取用户作为函数参数提供的内容的一般惯用法是deparse(substitute(foo))。这个功能类似于@Ian Ross,但采用了这个标准惯用语:

ifrm <- function(obj, env = globalenv()) {
    obj <- deparse(substitute(obj))
    if(exists(obj, envir = env)) {
        rm(list = obj, envir = env)
    }
}

我假设您只想从全局环境中删除对象,因此是默认设置,但您可以通过env提供环境。在这里,它正在发挥作用:

> a <- 1:10
> ls()
[1] "a"    "ifrm"
> ifrm(a)
> ls()
[1] "ifrm"
> ifrm(a)
> ls()
[1] "ifrm"

答案 1 :(得分:3)

保持简单。只需将对象的名称作为字符串传递给函数,而不是尝试从实际对象中获取名称。

ifrm <- function(x, env = globalenv()) 
{
  if(exists(x, envir = env)) 
  {
    rm(list = x, envir = env)
  }
}

答案 2 :(得分:2)

这有点难看,但似乎有效:

ifrm <- function(arg) {
  if (exists(as.character(substitute(arg)))) {
    rm(list=as.character(substitute(arg)), envir=sys.frame())
  }
}

如果您没有从顶级环境中删除名称,则可能需要以不同方式指定环境。

答案 3 :(得分:2)

试试这个

 a=1; b=3; y=4; ls() 
 rm( list = Filter( exists, c("a", "b", "x", "y") ) )
 ls()