2011-08-24 18 views
6

Tôi đang cố gắng viết một hàm loại bỏ một đối tượng nếu nó tồn tại. Lý do là tôi muốn thoát khỏi thông báo đăng nhập Lỗi: đối tượng 'arg' không tìm thấy. Tôi thử như sau:Viết một hàm để xóa đối tượng nếu nó tồn tại

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

Thật không may điều này không loại bỏ các đối tượng nếu nó tồn tại

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

Bất kỳ gợi ý những gì tôi làm sai ở đây?

nhất Albrecht

+2

này nghe có vẻ như một điều có thể nguy hiểm để làm. Bạn có muốn cung cấp cho chúng tôi chi tiết hơn một chút về các trường hợp bạn gặp phải lỗi này không? Có thể có các cách khác để xử lý thông báo lỗi của bạn phù hợp hơn. – Andrie

+1

Tôi đồng ý với Andrie. Các câu trả lời được cung cấp sẽ làm những gì bạn hỏi, nhưng rất có thể những gì bạn thực sự nên làm thậm chí còn đơn giản hơn. Hãy xem thử và trycatch. Điều gì mà bạn đang cố gắng làm điều đó là cố gắng xử lý các đối tượng không tồn tại? –

Trả lời

8

Thành ngữ chung để lấy những gì người dùng đã cung cấp làm đối số cho hàm là deparse(substitute(foo)). Chức năng này tương tự như của @Ian Ross nhưng sử dụng thành ngữ tiêu chuẩn này:

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

nơi tôi giả sử bạn chỉ bao giờ muốn để loại bỏ các đối tượng từ môi trường toàn cầu, vì thế mà mặc định, nhưng bạn có thể cung cấp một môi trường thông qua env . Và tại đây nó đang hoạt động:

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

Bạn nên thêm cảnh báo rằng việc sử dụng lệnh thô (thay thế()) trong hàm lồng nhau sẽ bị ràng buộc gây ra sự cố. myrm <- function (x) ifrm (x) sẽ không làm những gì bạn nghĩ nó ... –

+1

@ Joris +1 điểm tốt, nhưng sau đó người ta có thể nói, không làm điều đó! ;-) –

1

Đây là loại xấu xí, nhưng nó dường như làm việc:

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

Bạn có thể muốn xác định môi trường khác nhau nếu bạn không loại bỏ tên khỏi môi trường cấp cao nhất .

3

Hãy đơn giản. Chỉ cần chuyển tên của đối tượng vào hàm của bạn dưới dạng chuỗi ký tự, thay vì cố gắng lấy tên từ đối tượng thực tế.

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

Hãy thử điều này

a=1; b=3; y=4; ls() 
rm(list = Filter(exists, c("a", "b", "x", "y"))) 
ls() 
Các vấn đề liên quan