Setara dengan “throw” di R

140

Bagaimana seseorang "melempar" kesalahan pada R? Saya memiliki fungsi yang mengambil bingkai data dan beberapa nama kolom dan mengerjakannya. Jika kolom tidak ada, saya ingin fungsi berhenti dan menghentikan semua fungsi tergantung padanya.

Saya telah melihat recoverdan browsedan tracebacktetapi, yah, mereka sepertinya dekat tetapi tidak apa yang saya cari.

forkandunggu
sumber
2
Right, recover, browser, dan traceback untuk debugging, sedangkan sistem try / catch untuk menangani kesalahan dalam kode produksi.
Harlan
20
Saya suka ketika penanya menggunakan nama fungsi yang mereka cari beberapa kali dalam sebuah pertanyaan;)
Hadley
Saya pikir ada alasan mengapa pertanyaan ini memiliki lebih banyak suara positif daripada jawaban teratas. Meskipun pertanyaan lain ini secara teknis di luar topik, itu adalah jenis ringkasan yang sangat baik dari topik yang tidak dikenal yang terkenal dengan Stack Overflow.
Josiah Yoder

Jawaban:

113

Lihat help(tryCatch):

Kondisi ditandai oleh ' signalCondition'. Selain itu, fungsi
' stop' dan ' warning' telah dimodifikasi untuk juga menerima
argumen kondisi.

dan kemudian di bawah 'Lihat Juga':

' stop' dan ' warning' kondisi sinyal, dan ' try' pada dasarnya adalah versi sederhana dari ' tryCatch'.

jadi kamu mungkin mau stop.

Dirk Eddelbuettel
sumber
24
Itu bekerja dengan sempurna. R sangat aneh, bukan karena kesalahan mereka sendiri - itu dirancang jauh sebelum kami menyetel desain bahasa yang baik ditafsirkan.
forkandunggu
5
Menurut penulis, itu sangat dipengaruhi oleh Skema, yang lama dan baik. R adalah 'lispy' tetapi dengan struktur data yang funky. Bagian "menarik" dalam R mungkin terkait dengan banyak konvensi berbeda dari bahasa lain, terutama keluarga bahasa-C yang secara sintaksis juga dekat. Saya kira karena bahasa itu dikembangkan oleh sekelompok ahli statistik yang membutuhkan alat yang baik, daripada pengembang yang membutuhkan alat yang baik. Fakta bahwa 'titik' hanya karakter membutuhkan waktu lama untuk diterima.
KarlP
5
Beberapa contoh dasar di sini akan bagus, tidak hanya memiliki kutipan. Di sini stackoverflow.com/a/23917007/54964
Léo Léopold Hertz 준영
Saya sampai pada pertanyaan ini ketika mencari cara untuk memperbaiki kembali kesalahan dalam R dengan pesan kesalahan yang lebih waras, tetapi menjaga jejaknya tetap utuh (seperti pada, Anda menjalankan traceback()setelah kesalahan untuk melihat apa yang salah). Menggunakan stopdi errorargumen tryCatchakan mengacaukan jejak. Namun, finallyargumen tersebut akan memungkinkan untuk melempar pesan tambahan dan membuat jejak berguna. Tidak tepat pada topik, tapi, saya rasa, cukup penting untuk menjamin beberapa minus dan ancaman moderat mengeluarkan komentar ini keluar dari jendela. :-)
Mali Remorker
48

Contoh sederhana:

f <- function(a, b){ 

    if (a == 0){ 
            stop("error message")
    }
 }
Christian Herrera Jiménez
sumber
Di sini stackoverflow.com/a/23917007/54964 untuk variabel dalam pesan kesalahan.
Léo Léopold Hertz 준영
8

Di luar fungsi dasar yang Dirk sebutkan:

The R.oo paket memiliki tambahan fungsi yang menangani exception, termasuk fungsi lemparan () yang sangat berguna. Anda dapat menangkap pengecualian dengan fungsi try atau trycatch yang biasa:

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

Anda dapat membaca lebih lanjut di sini: http://www1.maths.lth.se/help/R/R.oo/

Shane
sumber
8
Hehe. R tidak cukup funky tanpa OO? Maaf untuk flip, dan pasti terima kasih atas jawaban yang menarik, tapi saya akan pergi dengan berhenti tua biasa () di atas.
forkandunggu
1
Bahkan ada lebih banyak OO sekarang. :)
Iterator
3
@ws. Apa yang funky tentang R? plotmemplot sebuah fungsi, try stop warnsemua berfungsi seperti yang Anda harapkan, dan hampir semua yang ingin saya lakukan adalah one-liner.
isomorfisma
4
Seringkali "kekuatan satu kalimat" bukan metrik yang baik untuk suatu bahasa. Bagi banyak dari kita yang dapat dibaca, kode yang dapat dimengerti mengalahkan lebih sedikit baris. Memang, banyak hal yang tidak dapat dipahami bagi saya karena saya seorang pemula, dan saya mencoba untuk mengkalibrasi harapan yang sesuai. Tetapi bahasa lain membuatnya cukup intuitif untuk beralih dari 0 ke menyelesaikan pekerjaan. R juga tampaknya telah mengembangkan budaya pintar, sulit dibaca satu kalimat. Saya berpendapat untuk budaya kode seperti bahasa Inggris secara maksimal, yang sering juga bisa menjadi satu-baris, seperti Ruby.
Philip
6

Sebenarnya fungsi stopifnotini sangat mudah untuk menerapkan pemeriksaan kewarasan dalam kode Anda. Ini mengambil beberapa ekspresi logis dan mengembalikan kesalahan jika salah satu dari mereka bernilai false.

Contoh: Untuk memeriksa apakah kolom 'c' ada dalam kerangka data 'df':

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

Ini akan menimbulkan kesalahan berikut:

Error: !is.null(df$c) is not TRUE
Chris
sumber
Kedengarannya seperti Python assert(...)...
Josiah Yoder
1

Anda dapat memeriksa apakah kolom ada dan melakukan apa pun yang Anda inginkan.
Misalkan data.framenama df1dan memeriksa jika col1ada kolom :

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

atau

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

Misalnya

xm1
sumber