0Pricing
R Academy · บทเรียน

ข้อผิดพลาด คำเตือน และข้อความใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ข้อผิดพลาด คำเตือน และข้อความใน R
  2. tryCatch() สำหรับการกู้คืนจากข้อผิดพลาด
  3. withCallingHandlers() และการเริ่มทำงานใหม่
  4. การเขียนฟังก์ชันที่ทนทานด้วย stop() และ warning()
← กลับไปที่ R Academy