Tương đương với ném ném vào R trong R


140

Làm thế nào để một "ném" một lỗi trong R? Tôi có một hàm lấy một khung dữ liệu và một số tên cột và thực hiện công cụ với chúng. Nếu các cột không tồn tại, tôi muốn hàm dừng và dừng tất cả các hàm tùy thuộc vào nó.

Tôi đã xem xét recoverbrowse, tracebacknhưng, tốt, họ dường như gần gũi nhưng không phải là những gì tôi đang tìm kiếm.


2
Phải, phục hồi, trình duyệt và truy nguyên là để gỡ lỗi, trong khi các hệ thống thử / bắt là để xử lý lỗi trong mã sản xuất.
Harlan

20
Tôi thích nó khi người hỏi câu hỏi sử dụng tên của hàm mà họ đang tìm kiếm nhiều lần trong một câu hỏi;)
hadley

Tôi nghĩ rằng có một lý do câu hỏi này có nhiều upvote hơn câu trả lời hàng đầu. Mặc dù câu hỏi khác này không có chủ đề về mặt kỹ thuật, nhưng đó là loại tóm tắt tuyệt vời chặt chẽ về một chủ đề xa lạ mà Stack Overflow nổi tiếng.
Josiah Yoder

Câu trả lời:


113

Xem help(tryCatch):

Các điều kiện được báo hiệu bởi ' signalCondition'. Ngoài ra, các hàm
' stop' và ' warning' đã được sửa đổi để chấp nhận các
đối số điều kiện.

và sau đó trong phần 'Xem thêm':

' stop' Và ' warning' điều kiện tín hiệu, và ' try' được bản chất là một phiên bản của đơn giản hóa ' tryCatch'.

vì vậy bạn có thể muốn stop.


24
Điều đó hoạt động hoàn hảo. R rất kỳ lạ, không có lỗi của riêng họ - nó đã được thiết kế từ lâu trước khi chúng tôi giải quyết thiết kế ngôn ngữ diễn giải tốt.
chờ đợi vào

5
Theo các tác giả, nó đã bị ảnh hưởng nặng nề bởi Scheme, cả hai đều cũ và tốt. R là 'lispy' nhưng với cấu trúc dữ liệu sôi nổi. Các phần "thú vị" trong R có lẽ liên quan đến rất nhiều quy ước khác với các ngôn ngữ khác, đáng chú ý là họ ngôn ngữ C mà nó cũng rất gần gũi về mặt cú pháp. Tôi đoán vì ngôn ngữ được phát triển bởi một nhóm các nhà thống kê cần một công cụ tốt, thay vì các nhà phát triển cần một công cụ tốt. Chỉ cần một thực tế là 'chấm' chỉ là một nhân vật mất một thời gian dài để có trong.
KarlP

5
Một số ví dụ cơ bản ở đây sẽ là tuyệt vời, không chỉ có trích dẫn. Tại đây stackoverflow.com/a/23917007/54964
Léo Léopold Hertz 30/10 '

Tôi đã đến câu hỏi này khi tìm kiếm cách sửa lại lỗi trong R bằng thông báo lỗi saner, nhưng vẫn giữ nguyên dấu vết (như trong, bạn thực hiện traceback()sau lỗi để xem có lỗi gì). Sử dụng stoptrong errorlập luận của tryCatchsẽ làm rối tung dấu vết. Tuy nhiên, finallyđối số sẽ cho phép ném một thông báo bổ sung và giữ dấu vết hữu ích. Không chính xác về chủ đề, nhưng, tôi cảm thấy, đủ quan trọng để đảm bảo một vài nhược điểm và một mối đe dọa kiểm duyệt đá bình luận này ra khỏi cửa sổ. :-)
Remorker Mali


8

Ngoài các chức năng cơ bản mà Dirk đề cập:

Các gói R.oo có thêm chức năng xử lý ngoại lệ, trong đó có một chức năng ném () mà là rất hữu ích. Bạn có thể bắt ngoại lệ với các chức năng thử hoặc trycatch thông thường:

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

Bạn có thể đọc thêm về nó ở đây: http://www1.maths.lth.se/help/R/R.oo/


8
Hehe. R không đủ sôi nổi nếu không có OO? Xin lỗi để được lật, và chắc chắn cảm ơn vì câu trả lời thú vị, nhưng tôi sẽ đi với điểm dừng cũ () đơn giản ở trên.
chờ đợi

1
Thậm chí còn có nhiều OO hơn bây giờ. :)
Lặp đi lặp lại

3
@ws. R có gì thú vị về R? plotvẽ một hàm, try stop warntất cả đều hoạt động như bạn mong đợi và hầu hết mọi thứ tôi muốn làm là một lớp lót.
đẳng cấu

4
Thông thường "sức mạnh của một lớp" không phải là một thước đo tốt cho ngôn ngữ. Đối với nhiều người trong chúng ta có thể đọc được, mã dễ hiểu hơn các dòng ít hơn. Thật vậy, nhiều điều không thể hiểu được đối với tôi bởi vì tôi là người mới bắt đầu và tôi cố gắng hiệu chỉnh các kỳ vọng tương ứng. Nhưng các ngôn ngữ khác làm cho nó khá trực quan để đi từ 0 đến hoàn thành công việc. R dường như cũng đã phát triển một nền văn hóa thông minh, khó đọc một lớp lót. Tôi sẽ tranh luận về một nền văn hóa mã giống như tiếng Anh tối đa, thường có thể là một dòng, như Ruby.
Philip

6

Trên thực tế chức năng stopifnotnày rất thuận tiện để thực hiện kiểm tra độ tỉnh táo trong mã của bạn. Nó nhận một số biểu thức logic và trả về lỗi nếu bất kỳ trong số chúng đánh giá là sai.

Ví dụ: Để kiểm tra xem cột 'c' có tồn tại trong khung dữ liệu 'df' không:

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

Điều này sẽ đưa ra lỗi sau:

Error: !is.null(df$c) is not TRUE

Nghe giống như của Python assert(...)...
Josiah Yoder

1

Bạn có thể kiểm tra nếu cột tồn tại và làm bất cứ điều gì bạn muốn.
Giả sử một cột data.frameđược đặt tên df1và kiểm tra nếu cột col1tồn tại:

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

hoặc là

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

Ví dụ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.