Напишите функцию для удаления объекта, если он существует - PullRequest
6 голосов
/ 24 августа 2011

Я пытаюсь написать функцию, которая удаляет объект, если он существует.Причина в том, что я хочу избавиться от сообщения журнала Ошибка: объект '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 ]

8 голосов
/ 24 августа 2011

Общая фраза для захвата того, что пользователь предоставил в качестве аргумента функции: 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"
3 голосов
/ 24 августа 2011

Будьте проще. Просто передайте имя объекта в вашу функцию в виде строки символов, а не пытайтесь получить имя от реального объекта.

ifrm <- function(x, env = globalenv()) 
{
  if(exists(x, envir = env)) 
  {
    rm(list = x, envir = env)
  }
}
2 голосов
/ 24 августа 2011

Попробуйте это

 a=1; b=3; y=4; ls() 
 rm( list = Filter( exists, c("a", "b", "x", "y") ) )
 ls()
2 голосов
/ 24 августа 2011

Это некрасиво, но, похоже, работает:

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

Возможно, вы захотите указать среду по-другому, если вы не удаляете имена из среды верхнего уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...