2011-08-24 25 views
6

我想写一个函数,删除一个对象,如果它存在。原因是我想摆脱日志消息Error:object'arg'not found。我试过如下:编写一个函数删除对象,如果它存在

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 

任何提示我错在这里做到这一点不删除对象?

最佳阿尔布雷希

+2

这听起来像一个可能是危险的事情。你想给我们一些关于你遇到这个错误的情况的更多细节吗?处理错误信息可能有其他方法更合适。 – Andrie

+1

我同意安德烈。提供的答案将完成你所问的内容,但很可能你应该做的更简单。看看尝试和trycatch。你试图做的是什么,试图处理不存在的对象? –

回答

8

抓住用户作为参数提供给函数的一般习语是deparse(substitute(foo))。这个功能类似于@Ian罗斯,但采用这种标准的成语:

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" 
+2

应该添加一个警告,即在嵌套函数中使用deparse(substitute())会带来麻烦。 myrm < - function(x)ifrm(x)不会做你认为它的事情...... –

+1

@Joris +1好点,但可以说,不要那么做! ;-) –

1

这是一种丑陋,但它似乎工作:

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

您可能需要指定不同的,如果你不从顶层环境中删除名称环境。

3

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

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

试试这个

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