การวนซ้ำเมื่อ“ คำเตือน ()” ปรากฏใน R


103

ฉันมีปัญหา: ฉันกำลังดำเนินการวนซ้ำเพื่อประมวลผลไฟล์หลายไฟล์ เมทริกซ์ของฉันมีขนาดใหญ่มากดังนั้นฉันมักจะมีหน่วยความจำไม่เพียงพอหากฉันไม่ระวัง

มีวิธีที่จะแยกออกจากการวนซ้ำหากมีการสร้างคำเตือนหรือไม่? มันทำงานวนไปเรื่อย ๆ และรายงานว่ามันล้มเหลวในภายหลัง ... น่ารำคาญ ความคิดใด ๆ ที่ชาญฉลาด stackoverflow-ers ?!

คำตอบ:


151

คุณสามารถเปลี่ยนคำเตือนให้เป็นข้อผิดพลาดได้ด้วย:

options(warn=2)

ข้อผิดพลาดจะขัดขวางการวนซ้ำซึ่งแตกต่างจากคำเตือน นอกจากนี้ R จะรายงานให้คุณทราบด้วยว่าข้อผิดพลาดเหล่านี้ถูกแปลงมาจากคำเตือน

j <- function() {
    for (i in 1:3) {
        cat(i, "\n")
        as.numeric(c("1", "NA"))
}}

# warn = 0 (default) -- warnings as warnings!
j()
# 1 
# 2 
# 3 
# Warning messages:
# 1: NAs introduced by coercion 
# 2: NAs introduced by coercion 
# 3: NAs introduced by coercion 

# warn = 2 -- warnings as errors
options(warn=2)
j()
# 1 
# Error: (converted from warning) NAs introduced by coercion

24
หลังจากนั้นใช้options(warn=1) เพื่อคืนค่าการตั้งค่าเริ่มต้น
Alex Holcombe

25
ค่าเริ่มต้นคือ 0 แม้ว่า ดังนั้นการเรียกคืนการตั้งค่าจากโรงงานoptions("warn"=0)ใช้
Dirk Eddelbuettel

การรีเซ็ตตัวเลือกใน R มักจะจัดการได้ดีที่สุดโดย 1) op=options(warn=2)2) ทำสิ่งต่างๆของคุณแล้ว 3) รีเซ็ตด้วยoptions(op)ซึ่งจะนำคุณกลับไปwarn=0ในกรณีนี้
mbiron

44

R ช่วยให้คุณกำหนดตัวจัดการเงื่อนไข

x <- tryCatch({
    warning("oops")
}, warning=function(w) {
    ## do something about the warning, maybe return 'NA'
    message("handling warning: ", conditionMessage(w))
    NA
})

ซึ่งส่งผลให้

handling warning: oops
> x
[1] NA

การดำเนินการยังคงดำเนินต่อไปหลังจาก tryCatch; คุณสามารถตัดสินใจยุติโดยการแปลงคำเตือนเป็นข้อผิดพลาด

x <- tryCatch({
    warning("oops")
}, warning=function(w) {
    stop("converted from warning: ", conditionMessage(w))
})

หรือจัดการกับเงื่อนไขอย่างสง่างาม (การประเมินอย่างต่อเนื่องหลังจากการเรียกเตือน)

withCallingHandlers({
    warning("oops")
    1
}, warning=function(w) {
    message("handled warning: ", conditionMessage(w))
    invokeRestart("muffleWarning")
})

ซึ่งพิมพ์

handled warning: oops
[1] 1

+1 - ยอดเยี่ยม ฉันเคยคิดที่จะพูดถึงตัวเลือกนี้ แต่ไม่สามารถรวบรวมบทแนะนำสั้น ๆ แต่น่ารักเช่นนี้ได้
Josh O'Brien

มีการสาธิตด้วยforจะดีกว่า :)
JelenaČuklina

28

ตั้งค่าwarnตัวเลือกส่วนกลาง:

options(warn=1)  # print warnings as they occur
options(warn=2)  # treat warnings as errors

โปรดทราบว่า "คำเตือน" ไม่ใช่ "ข้อผิดพลาด" ลูปจะไม่สิ้นสุดสำหรับคำเตือน (เว้นแต่options(warn=2))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.