2011-08-24 15 views
6

Próbuję napisać funkcję, która usuwa obiekt, jeśli istnieje. Powodem jest to, że chcę pozbyć się komunikatu logu Błąd: nie znaleziono obiektu "arg". Próbowałem następujące:Napisz funkcję, aby usunąć obiekt, jeśli istnieje

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

Niestety nie usunąć obiekt, jeśli istnieje

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

żadnych wskazówek co robię źle tutaj?

Najlepszy Albrecht

+2

brzmi to jak potencjalnie niebezpieczną rzeczą. Czy chcesz dać nam nieco więcej szczegółów na temat okoliczności, w których pojawia się ten błąd? Mogą istnieć inne sposoby radzenia sobie z komunikatem o błędzie, które są bardziej odpowiednie. – Andrie

+1

Zgadzam się z Andrie. Dostarczone odpowiedzi zrobią to, o co prosiłeś, ale najprawdopodobniej to, co powinieneś robić, jest jeszcze prostsze. Spójrz na try i trycatch. Czego próbujesz dokonać, to próba przetworzenia nieistniejących obiektów? –

Odpowiedz

8

Ogólnym idiomem do pobrania tego, co użytkownik podał jako argument funkcji jest deparse(substitute(foo)). Funkcja ta jest podobna do tej z @Ian Ross ale używając tego standardowego idiom:

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

gdzie Zakładam, że tylko kiedykolwiek chcesz usunąć obiekty z otoczenia globalnego, stąd domyślnie, ale można dostarczyć środowisko poprzez env . A tutaj jest w akcji:

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

Należy dodać ostrzeżenie, że użycie funkcji deparse (substitute()) w funkcji zagnieżdżonej spowoduje problemy. myrm <- function (x) ifrm (x) nie zrobi tego, co myślisz ... –

+1

@Joris +1 dobry punkt, ale wtedy można powiedzieć, nie rób tego! ;-) –

1

Jest to rodzaj brzydki, ale wydaje się działać:

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

Możesz chcieć określić środowisko różnie jeśli nie usuwając nazwiska ze środowiska najwyższego poziomu .

3

Zachowaj to proste. Wystarczy podać nazwę obiektu do swojej funkcji jako ciąg znaków, zamiast próbować uzyskać nazwę z rzeczywistego obiektu.

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

Spróbuj

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