ข้อผิดพลาด คำเตือน และข้อความใน R
ทำความเข้าใจสัญญาณทั้งสามชนิดและช่วงเวลาที่แต่ละชนิดถูกส่งออกมา
ข้อผิดพลาด คำเตือน และข้อความใน R เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
ระบบเงื่อนไขของ R
R มีระบบเงื่อนไขอย่างเป็นทางการสำหรับสื่อสารปัญหา คลาสเงื่อนไขหลักมีสามประเภท ได้แก่ ข้อผิดพลาด (ร้ายแรง — หยุดการทำงาน) คำเตือน (ไม่ร้ายแรง — แสดงหลังโค้ดทำงานเสร็จ) และ ข้อความ (ข้อมูลประกอบ — ส่งไปยัง stderr)
# Each condition type behaves differently
message('This is a message')
warning('This is a warning')
# stop() would halt here, so wrap it
tryCatch(stop('This is an error'), error = function(e) print(e))stop() — การสร้างข้อผิดพลาด
stop(msg) ส่งสัญญาณเงื่อนไขข้อผิดพลาด การทำงานจะหยุดทันทีและแสดงข้อความข้อผิดพลาด ใช้ภายในฟังก์ชันเพื่อยกเลิกการทำงานเมื่ออินพุตไม่ถูกต้องหรือตรวจพบสถานการณ์ที่ไม่สามารถกู้คืนได้
divide <- function(x, y) {
if (y == 0) stop('Division by zero is not allowed')
x / y
}
tryCatch(divide(10, 0), error = function(e) cat('Error:', conditionMessage(e), '\n'))
divide(10, 2)warning() — คำเตือนที่ไม่ร้ายแรง
warning(msg) ส่งสัญญาณเงื่อนไขคำเตือน ต่างจากข้อผิดพลาด คำเตือนจะไม่หยุดการทำงาน — ฟังก์ชันจะทำงานต่อและรวบรวมคำเตือนไว้ โดยค่าเริ่มต้นจะแสดงคำเตือนหลังโค้ดทั้งหมดทำงานเสร็จ หรือแสดงทันทีหากตั้งค่า options(warn=1)
safe_sqrt <- function(x) {
if (x < 0) {
warning('Negative input; returning NaN')
return(NaN)
}
sqrt(x)
}
result <- safe_sqrt(-4)
cat('Result:', result, '\n')message() — เงื่อนไขข้อมูลประกอบ
message(msg) ส่งสัญญาณเงื่อนไขข้อความ โดยส่งไปยัง stderr เพิ่มการขึ้นบรรทัดใหม่อัตโนมัติ และปิดได้ด้วย suppressMessages() ใช้สำหรับรายงานความคืบหน้าในฟังก์ชัน ไม่ใช่สำหรับข้อผิดพลาดหรือคำเตือน
load_data <- function(n) {
message('Loading ', n, ' records...')
seq_len(n)
}
data <- suppressMessages(load_data(100))
cat('Got', length(data), 'records\n')ออบเจ็กต์ simpleError และ simpleWarning
เมื่อ R สร้างเงื่อนไข ระบบจะห่อข้อความไว้ในออบเจ็กต์เงื่อนไข simpleError('msg') และ simpleWarning('msg') ใช้สร้างออบเจ็กต์เงื่อนไขด้วยตนเอง คุณตรวจสอบออบเจ็กต์เหล่านี้ได้ด้วย conditionMessage()
e <- simpleError('something went wrong')
w <- simpleWarning('this looks suspicious')
cat('Error class :', class(e), '\n')
cat('Warning class :', class(w), '\n')
cat('Error message :', conditionMessage(e), '\n')
cat('Warning msg :', conditionMessage(w), '\n')conditionMessage() และ conditionCall()
conditionMessage(cond) ดึงข้อความจากออบเจ็กต์เงื่อนไขใด ๆ conditionCall(cond) ดึงการเรียกใช้ที่ทำให้เกิดเงื่อนไข ทั้งสองฟังก์ชันมีประโยชน์ภายในตัวจัดการข้อผิดพลาดสำหรับการบันทึกหรือส่งสัญญาณเงื่อนไขซ้ำ
tryCatch(
log(-1),
warning = function(w) {
cat('Caught warning :', conditionMessage(w), '\n')
cat('From call :', deparse(conditionCall(w)), '\n')
}
)options(warn = 2) — เปลี่ยนคำเตือนเป็นข้อผิดพลาด
การตั้งค่า options(warn = 2) จะเปลี่ยนคำเตือนทั้งหมดเป็นข้อผิดพลาด ทำให้หยุดการทำงานทันที เหมาะสำหรับใช้ระหว่างพัฒนาเพื่อค้นหาโค้ดที่สร้างคำเตือนได้ตั้งแต่เนิ่น ๆ คืนค่าเดิมด้วย options(warn = 0)
old_warn <- options(warn = 0) # default: collect warnings
log(-1) # just a warning
options(warn = 0)
tryCatch({
options(warn = 2)
log(-1) # now fatal
}, error = function(e) cat('Caught as error:', conditionMessage(e), '\n'),
finally = options(old_warn))คำเตือนทันทีเทียบกับคำเตือนที่เลื่อนการแสดงผล
เมื่อใช้ options(warn = 0) (ค่าเริ่มต้น) คำเตือนจะถูกรวบรวมและแสดงเมื่อจบการทำงาน เมื่อใช้ options(warn = 1) คำเตือนแต่ละรายการจะแสดงทันทีที่เกิดขึ้น และเมื่อใช้ warn = 2 คำเตือนจะกลายเป็นข้อผิดพลาด
# warn=1: print warnings immediately as they happen
old <- options(warn = 1)
result1 <- log(-1)
result2 <- sqrt(-4)
cat('Results:', result1, result2, '\n')
options(old)ข้อผิดพลาดกับคำเตือน: ร้ายแรงกับไม่ร้ายแรง
ความแตกต่างที่สำคัญคือ ข้อผิดพลาดจะหยุดการทำงานทั้งหมด เว้นแต่ตัวจัดการจะดักจับไว้ ส่วนคำเตือนจะถูกบันทึกไว้แต่การทำงานยังดำเนินต่อไป ดังนั้นอินพุตที่ไม่ถูกต้องอาจสร้างผลลัพธ์ผิดโดยไม่รู้ตัว หากใช้คำเตือนในกรณีที่ควรใช้ข้อผิดพลาด
# With warning: execution continues
f_warn <- function(x) { if (x < 0) warning('negative'); x^2 }
cat('warn result:', f_warn(-3), '\n') # still computes 9
# With error: execution stops
f_stop <- function(x) { if (x < 0) stop('negative'); x^2 }
tryCatch(f_stop(-3), error = function(e) cat('stopped:', e$message, '\n'))การซ้อนเงื่อนไข
สามารถยกเงื่อนไขภายในตัวจัดการเงื่อนไขอื่นได้ ตัวจัดการคำเตือนสามารถเรียกใช้ stop() เพื่อยกระดับคำเตือนเป็นข้อผิดพลาด รูปแบบนี้ใช้กันทั่วไปเพื่อทำให้โค้ดจากบุคคลที่สามเข้มงวดมากขึ้น
strict_log <- function(x) {
withCallingHandlers(
log(x),
warning = function(w) {
stop(paste('Strict mode: warning treated as error:', conditionMessage(w)))
}
)
}
tryCatch(strict_log(-1), error = function(e) cat('Error:', e$message, '\n'))
cat('log(4) =', strict_log(4), '\n')suppressWarnings() และ suppressMessages()
suppressWarnings(expr) ประเมินนิพจน์พร้อมดักจับและละทิ้งคำเตือนทั้งหมดอย่างเงียบ ๆ ส่วน suppressMessages(expr) ทำเช่นเดียวกันกับเงื่อนไขข้อความ ควรใช้ฟังก์ชันเหล่านี้อย่างระมัดระวัง เพราะการปิดคำเตือนอาจซ่อนปัญหาที่เกิดขึ้นจริง
# Without suppression: warning shown
result1 <- log(-1)
# With suppression: warning hidden
result2 <- suppressWarnings(log(-1))
cat('Both are NaN:', is.nan(result1), is.nan(result2), '\n')ตรวจสอบความเข้าใจอย่างรวดเร็ว
ข้อใดต่อไปนี้อธิบายความแตกต่างระหว่าง warning() กับ stop() ได้ถูกต้อง?
เงื่อนไข: ประเด็นสำคัญ
ประเด็นสำคัญเกี่ยวกับเงื่อนไขของ R:
stop()= ข้อผิดพลาด = ร้ายแรง หยุดทันที;warning()= ไม่ร้ายแรง การทำงานดำเนินต่อ;message()= ข้อมูลประกอบ ส่งไปยัง stderr- ทั้งสามฟังก์ชันสร้างออบเจ็กต์เงื่อนไขที่มีลำดับชั้นของคลาส
conditionMessage(e)ดึงข้อความจากเงื่อนไขใด ๆoptions(warn=1)แสดงคำเตือนทันที ส่วนwarn=2ถือว่าคำเตือนเป็นข้อผิดพลาดsuppressWarnings()/suppressMessages()ปิดเสียงเงื่อนไข- ควรใช้
stop()กับอินพุตที่ไม่ถูกต้องเมื่อการทำงานต่อจะทำให้ผลลัพธ์ผิด
# Summary of the three condition functions
tryCatch({
message('Step 1 starting')
warning('something looks odd')
stop('cannot continue')
}, message = function(m) cat('MSG:', conditionMessage(m)),
warning = function(w) cat('WARN:', conditionMessage(w), '\n'),
error = function(e) cat('ERR:', conditionMessage(e), '\n'))คำถามที่พบบ่อย
บทเรียน “ข้อผิดพลาด คำเตือน และข้อความใน R” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ข้อผิดพลาด คำเตือน และข้อความใน R” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ข้อผิดพลาด คำเตือน และข้อความใน R”
ทำความเข้าใจสัญญาณทั้งสามชนิดและช่วงเวลาที่แต่ละชนิดถูกส่งออกมา คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ข้อผิดพลาด คำเตือน และข้อความใน R” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ข้อผิดพลาด คำเตือน และข้อความใน R
- tryCatch() สำหรับการกู้คืนจากข้อผิดพลาด
- withCallingHandlers() และการเริ่มทำงานใหม่
- การเขียนฟังก์ชันที่ทนทานด้วย stop() และ warning()