เทียบเท่ากับ“ โยน” ใน R


140

วิธีหนึ่ง "โยน" ข้อผิดพลาดใน R อย่างไร ฉันมีฟังก์ชั่นที่ใช้กรอบข้อมูลและชื่อคอลัมน์บางส่วนและทำสิ่งต่าง ๆ กับพวกเขา หากไม่มีคอลัมน์ฉันต้องการให้ฟังก์ชันหยุดและหยุดฟังก์ชั่นทั้งหมดโดยขึ้นอยู่กับมัน

ฉันได้ดูrecoverและbrowseและtracebackแต่ดีที่พวกเขาดูเหมือนจะใกล้ แต่ไม่ใช่สิ่งที่ฉันกำลังมองหา


2
ขวากู้คืนเบราว์เซอร์และการย้อนกลับมีไว้สำหรับการดีบักในขณะที่ระบบ try / catch ใช้สำหรับจัดการข้อผิดพลาดในรหัสการผลิต
Harlan

20
ฉันรักเมื่อผู้ถามคำถามใช้ชื่อของฟังก์ชั่นที่พวกเขากำลังมองหาหลายครั้งในคำถาม;)
hadley

ฉันคิดว่ามีเหตุผลที่คำถามนี้มี upvotes มากกว่าคำตอบด้านบน แม้ว่าคำถามอื่น ๆ นี้จะไม่ได้อยู่ในหัวข้อทางเทคนิค แต่เป็นบทสรุปที่ยอดเยี่ยมอย่างมากของหัวข้อที่ไม่คุ้นเคยที่ Stack Overflow มีชื่อเสียง
Josiah Yoder

คำตอบ:


113

ดูhelp(tryCatch):

เงื่อนไขส่งสัญญาณโดย ' signalCondition' นอกจากนี้
' stop' และ ' warning' ฟังก์ชั่นได้รับการแก้ไขไปยังยอมรับ
ข้อโต้แย้งสภาพ

และในภายหลังภายใต้ 'ดูเพิ่มเติม':

' stop' และ ' warning' เงื่อนไขสัญญาณและ ' try' เป็นหลักรุ่นที่เรียบง่ายของ ' tryCatch'

stopดังนั้นคุณอาจต้องการ


24
ที่ใช้งานได้อย่างสมบูรณ์แบบ R เป็นสิ่งที่แปลกมากโดยไม่มีข้อผิดพลาดของตัวเอง - มันถูกออกแบบมานานก่อนที่เราจะออกแบบการตีความภาษาที่ดี
forkandwait

5
ตามที่ผู้เขียนได้รับอิทธิพลอย่างมากจากโครงการซึ่งเป็นทั้งเก่าและดี R คือ 'เงียบ' แต่มีโครงสร้างข้อมูลที่ขี้ขลาด ส่วน "น่าสนใจ" ใน R อาจเกี่ยวข้องกับการประชุมจำนวนมากที่แตกต่างจากภาษาอื่น ๆ โดยเฉพาะตระกูลภาษา C ที่มีการปิด syntactically เช่นกัน ฉันเดาเพราะภาษานั้นพัฒนาขึ้นโดยนักสถิติที่ต้องการเครื่องมือที่ดีมากกว่านักพัฒนาที่ต้องการเครื่องมือที่ดี ความจริงที่ว่า 'จุด' เป็นเพียงตัวละครใช้เวลานานในการเข้า
KarlP

5
ตัวอย่างพื้นฐานที่นี่จะดีมากไม่เพียง แต่มีการอ้างอิง stackoverflow.com/a/23917007/54964
LéoLéopold Hertz 준영

ฉันมาถึงคำถามนี้เมื่อค้นหาวิธีการสร้างข้อผิดพลาดใน R อีกครั้งด้วยข้อความแสดงข้อผิดพลาด saner แต่ทำให้การติดตามยังคงเหมือนเดิม (เช่นคุณดำเนินการtraceback()หลังจากข้อผิดพลาดเพื่อดูว่ามีอะไรผิดพลาด) ใช้stopในการerrorโต้แย้งของtryCatchจะเลอะร่องรอย อย่างไรก็ตามการfinallyโต้แย้งจะช่วยให้การโยนข้อความเพิ่มเติมและทำให้การติดตามมีประโยชน์ ไม่ตรงประเด็น แต่ฉันรู้สึกว่าสำคัญพอที่จะรับประกันไม่กี่นาทีและการคุกคามของการกลั่นกรองการแสดงความคิดเห็นนี้ออกไปนอกหน้าต่าง :-)
Mali Remorker


8

นอกเหนือจากฟังก์ชั่นพื้นฐานที่เดิร์คกล่าวถึง:

แพคเกจ R.ooได้ยกเว้นเพิ่มเติมฟังก์ชั่นการจัดการรวมทั้งการโยน () ฟังก์ชันที่มีประโยชน์มาก คุณสามารถตรวจจับข้อยกเว้นด้วยฟังก์ชัน trycatch หรือ trycatch ปกติ:

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

คุณสามารถอ่านเพิ่มเติมได้ที่นี่: http://www1.maths.lth.se/help/R/R.oo/


8
ฮิฮิ. R ไม่ได้เป็นคนขี้ขลาดพอหากไม่มี OO? ขออภัยที่จะพลิกและแน่นอนขอบคุณสำหรับคำตอบที่น่าสนใจ แต่ฉันจะไปกับหยุดเก่าธรรมดา () ด้านบน
forkandwait

1
ตอนนี้มี OO มากขึ้น :)
Iterator

3
@ws Funky เกี่ยวกับ R คืออะไร? plotพล็อตฟังก์ชั่นtry stop warnทั้งหมดทำงานได้ตามที่คุณคาดหวังและเกือบทุกอย่างที่ฉันต้องการจะทำคือซับไลน์เดียว
isomorphismes

4
บ่อยครั้งที่ "พลังแห่งหนึ่งตอร์ปิโด" ไม่ใช่ตัวชี้วัดที่ดีสำหรับภาษา สำหรับพวกเราหลายคนที่สามารถอ่านได้รหัสที่เข้าใจได้จะทำให้เกิดบรรทัดน้อยลง ที่จริงแล้วฉันไม่สามารถเข้าใจได้มากนักเพราะฉันเป็นผู้เริ่มต้นและฉันพยายามปรับเทียบความคาดหวังตามนั้น แต่ภาษาอื่นทำให้ใช้งานง่ายตั้งแต่ 0 ถึงการทำสิ่งต่างๆให้สำเร็จ R ดูเหมือนว่าจะได้พัฒนาวัฒนธรรมที่ฉลาดและยากที่จะอ่านหนึ่งสมุทร ฉันจะเถียงกับวัฒนธรรมของรหัสเหมือนภาษาอังกฤษมากที่สุดซึ่งมักจะเป็นหนึ่งใน liners เช่น Ruby
Philip

6

ที่จริงแล้วฟังก์ชั่นstopifnotนี้สะดวกในการใช้การตรวจสอบสติในรหัสของคุณ มันใช้เวลาในการแสดงออกตรรกะหลายและส่งกลับข้อผิดพลาดหากใด ๆ ของพวกเขาประเมินว่าเป็นเท็จ

ตัวอย่าง: วิธีตรวจสอบว่ามีคอลัมน์ 'c' อยู่ใน dataframe 'df' หรือไม่:

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

สิ่งนี้จะทำให้เกิดข้อผิดพลาดดังต่อไปนี้:

Error: !is.null(df$c) is not TRUE

ฟังดูเหมือน Python assert(...)...
Josiah Yoder

1

คุณสามารถตรวจสอบว่ามีคอลัมน์อยู่หรือไม่และทำตามที่คุณต้องการ
สมมติว่ามีdata.frameชื่อdf1และตรวจสอบว่าcol1มีคอลัมน์อยู่หรือไม่:

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

หรือ

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

ตัวอย่างเช่น

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