Jika saya menjalankan skrip R panjang dari baris perintah (R --slave script.R), bagaimana saya bisa membuatnya memberikan nomor baris pada saat kesalahan?
Saya tidak ingin menambahkan perintah debug ke skrip jika memungkinkan - saya hanya ingin R berperilaku seperti kebanyakan bahasa skrip lainnya ...
Jawaban:
Ini tidak akan memberi Anda nomor baris, tetapi ini akan memberi tahu Anda di mana kegagalan terjadi dalam tumpukan panggilan yang sangat membantu:
[Edit:] Saat menjalankan skrip dari baris perintah, Anda harus melewati satu atau dua panggilan, lihat traceback () untuk sesi R interaktif dan non-interaktif
Saya tidak mengetahui cara lain untuk melakukan ini tanpa tersangka debugging yang biasa:
Anda mungkin ingin melihat posting terkait ini.
[Edit:] Maaf ... baru saja melihat Anda menjalankan ini dari baris perintah. Dalam hal ini saya akan menyarankan bekerja dengan fungsionalitas opsi (kesalahan). Berikut contoh sederhananya:
Anda dapat membuat skrip serumit mungkin pada kondisi kesalahan, jadi Anda harus memutuskan informasi apa yang Anda perlukan untuk debugging.
Sebaliknya, jika ada area tertentu yang Anda khawatirkan (mis. Menghubungkan ke database), maka gabungkan mereka dalam fungsi tryCatch ().
sumber
options(error=function() { traceback(2); if(!interactive()) quit("no", status = 1, runLast = FALSE) })
(lihat komentar jawaban yang diterima). Saya pikir masuk akal untuk menambahkannya ke jawaban di sini daripada hanya memberikan tautan ke utas lain.Melakukan
options(error=traceback)
memberikan lebih banyak informasi tentang konten baris yang mengarah ke kesalahan. Ini menyebabkan pelacakan balik muncul jika ada kesalahan, dan untuk beberapa kesalahan memiliki nomor baris, diawali dengan#
. Tapi itu hit atau miss, banyak kesalahan tidak akan mendapatkan nomor baris.sumber
No traceback available
setelah kesalahan.Dukungan untuk ini akan datang di R 2.10 dan yang lebih baru. Duncan Murdoch baru saja memposting ke r-devel pada 10 Sep 2009 tentang findLineNum dan setBreapoint :
sumber
Anda melakukannya dengan mengatur
Saya hanya bertanya-tanya mengapa pengaturan ini bukan default di R? Seharusnya demikian, seperti dalam setiap bahasa lainnya.
sumber
Menentukan opsi R global untuk menangani kesalahan non-katastropik berhasil untuk saya, bersama dengan alur kerja yang disesuaikan untuk menyimpan info tentang kesalahan dan memeriksa info ini setelah kegagalan. Saya saat ini menjalankan R versi 3.4.1. Di bawah ini, saya telah menyertakan deskripsi alur kerja yang berhasil untuk saya, serta beberapa kode yang saya gunakan untuk mengatur opsi penanganan kesalahan global di R.
Seperti yang saya konfigurasikan, penanganan kesalahan juga membuat file RData yang berisi semua objek dalam memori kerja pada saat terjadi kesalahan. Dump ini dapat dibaca kembali ke R menggunakan
load()
dan kemudian berbagai lingkungan seperti yang ada pada saat kesalahan dapat diperiksa secara interaktif menggunakandebugger(errorDump)
.Saya akan mencatat bahwa saya bisa mendapatkan nomor baris dalam
traceback()
output dari fungsi khusus apa pun dalam tumpukan, tetapi hanya jika saya menggunakankeep.source=TRUE
opsi saat memanggilsource()
fungsi khusus apa pun yang digunakan dalam skrip saya. Tanpa opsi ini, pengaturan opsi penanganan kesalahan global seperti di bawah ini mengirimkan output penuhtraceback()
ke log kesalahan bernamaerror.log
, tetapi nomor baris tidak tersedia.Berikut adalah langkah-langkah umum yang saya ambil dalam alur kerja saya dan bagaimana saya dapat mengakses dump memori dan log kesalahan setelah kegagalan R non-interaktif.
Saya meletakkan yang berikut ini di bagian atas skrip utama yang saya panggil dari baris perintah. Ini menetapkan opsi penanganan kesalahan global untuk sesi R. Skrip utama saya dipanggil
myMainScript.R
. Berbagai baris dalam kode memiliki komentar setelah mereka menjelaskan apa yang mereka lakukan. Pada dasarnya, dengan opsi ini, ketika R menemukan kesalahan yang memicustop()
, itu akan membuat file dump RData (* .rda) dari memori kerja di semua lingkungan aktif dalam direktori~/myUsername/directoryForDump
dan juga akan menulis log kesalahan yang diberi namaerror.log
dengan beberapa informasi berguna ke direktori yang sama. Anda dapat memodifikasi potongan ini untuk menambahkan penanganan lain pada kesalahan (misalnya, menambahkan stempel waktu ke file dump dan nama file log kesalahan, dll.).Pastikan bahwa dari skrip utama dan pemanggilan fungsi berikutnya, kapan pun suatu fungsi bersumber, opsi
keep.source=TRUE
tersebut digunakan. Artinya, untuk mencari fungsi, Anda akan menggunakansource('~/path/to/myFunction.R', keep.source=TRUE)
. Ini diperlukan agartraceback()
keluaran berisi nomor baris. Sepertinya Anda juga dapat menyetel opsi ini secara globaloptions( keep.source=TRUE )
, tetapi saya belum menguji ini untuk melihat apakah berhasil. Jika Anda tidak memerlukan nomor baris, Anda dapat menghilangkan opsi ini.Rscript myMainScript.R
. Ini memulai sesi R non-interaktif baru dan menjalankan skripmyMainScript.R
. Potongan kode yang diberikan di langkah 1 yang telah ditempatkan di bagian atasmyMainScript.R
menetapkan opsi penanganan kesalahan untuk sesi R non-interaktif.myMainScript.R
. Ini mungkin dalam skrip utama itu sendiri, atau beberapa fungsi bertingkat dalam. Ketika kesalahan ditemukan, penanganan akan dilakukan seperti yang ditentukan pada langkah 1, dan sesi R akan berakhir.errorDump.rda
dan dan log galat bernamaerror.log
dibuat di direktori yang ditentukan oleh'~/myUsername/directoryForDump'
dalam pengaturan opsi penanganan galat global.Di waktu luang Anda, periksa
error.log
untuk meninjau informasi tentang kesalahan tersebut, termasuk pesan kesalahan itu sendiri dan jejak tumpukan lengkap yang mengarah ke kesalahan tersebut. Berikut adalah contoh log yang dihasilkan karena kesalahan; perhatikan angka setelah#
karakter adalah nomor baris kesalahan di berbagai titik dalam tumpukan panggilan:Di waktu luang Anda, Anda dapat memuat
errorDump.rda
sesi R interaktif menggunakanload('~/path/to/errorDump.rda')
. Setelah dimuat, panggildebugger(errorDump)
untuk menelusuri semua objek R dalam memori di salah satu lingkungan aktif. Lihat bantuan Rdebugger()
untuk info lebih lanjut.Alur kerja ini sangat membantu saat menjalankan R di beberapa jenis lingkungan produksi di mana Anda memiliki sesi R non-interaktif yang dimulai pada baris perintah dan Anda ingin informasi disimpan tentang kesalahan yang tidak terduga. Kemampuan untuk membuang memori ke file yang dapat Anda gunakan untuk memeriksa memori kerja pada saat terjadi kesalahan, bersama dengan memiliki nomor baris kesalahan dalam tumpukan panggilan, memfasilitasi debugging post-mortem yang cepat dari apa yang menyebabkan kesalahan.
sumber
Pertama,
options(show.error.locations = TRUE)
lalutraceback()
. Nomor baris yang salah akan ditampilkan setelah #sumber