R'de “atış” a eşdeğer


141

Kişi R'de bir hatayı nasıl "atar"? Bir veri çerçevesi ve bazı sütun adları alır ve onlarla şeyler yapan bir işlevi var. Sütunlar yoksa, işlevin durmasını ve buna bağlı olarak tüm işlevleri durdurmasını istiyorum.

Ben baktım recoverve browseve, tracebackama, onlar yakın görünüyordu ama aradığım şey değil.


2
Deneme / yakalama sistemleri üretim kodundaki hataları işlemek için doğru, kurtarma, tarayıcı ve geri izleme hata ayıklama içindir.
Harlan

20
Soru soranlar, bir soruda birden çok kez aradıkları işlevin adını kullandığında seviyorum;)
hadley

Bence bu sorunun en iyi cevaptan daha fazla oy kullanmasının bir nedeni var. Bu diğer soru teknik olarak konu dışı olsa da , Stack Overflow'un ünlü olduğu bilinmeyen bir konunun mükemmel bir şekilde sıkı bir özeti.
Josiah Yoder

Yanıtlar:


113

Bkz help(tryCatch):

Koşullar ' signalCondition' ile belirtilir. Ayrıca,
' stop' ve ' warning' işlevleri de
koşul bağımsız değişkenlerini kabul edecek şekilde değiştirildi .

ve daha sonra 'Ayrıca Bakınız' başlığı altında:

' stop' ve ' warning' sinyal koşulları ve ' try' temelde ' ' basitleştirilmiş bir sürümüdür tryCatch.

muhtemelen istersiniz stop.


24
Mükemmel çalışıyor. R çok garip, kendi hataları olmadan - iyi yorumlanmış dil tasarımını ütülemeden çok önce tasarlandı.
forkandwait

5
Yazarlara göre, hem eski hem de iyi olan Scheme'den büyük ölçüde etkilendi. R 'lispy' ama korkak veri yapılarına sahip. R'deki "ilginç" kısımlar muhtemelen birçok konvansiyonun diğer dillerden, özellikle de sözdizimsel olarak da yakın olduğu C dili ailesinden farklı olmasıyla ilgilidir. Tahmin ediyorum çünkü dil, iyi bir araca ihtiyaç duyan geliştiriciler yerine, iyi bir araca ihtiyaç duyan bir grup istatistikçi tarafından geliştirildi. Sadece "nokta" nın sadece bir karakter olması çok uzun sürdü.
KarlP

5
Buradaki bazı temel örnekler harika olurdu, sadece alıntı yapmakla kalmaz. Burada stackoverflow.com/a/23917007/54964
Léo Léopold Hertz

Bu soruya daha akılcı bir hata mesajı ile R'de bir hatayı nasıl yeniden arayacağımızı ararken, ancak izini sağlam tuttuğumda ( traceback()neyin yanlış gittiğini görmek için hatadan sonra yürüttüğünüzde) bu soruya geldim . Kullanılması stophalinde errorbir argüman tryCatchiz yukarı irade karmaşa. Ancak, finallyargüman ek bir mesaj atmaya izin verecek ve izini yararlı tutacaktır. Tam olarak konuyla ilgili değil, ama, birkaç eksiyi ve bu yorumu pencereden tekmeleme ılımlılık tehdidini garanti edecek kadar önemli hissediyorum. :-)
Mali Remorker


8

Dirk'in bahsettiği temel işlevlerin ötesinde:

R.oo paketi çok yararlı olan bir atış () işlevi de dahil olmak üzere ek bir özel işleme işlevi vardır. Her zamanki try veya trycatch işlevleriyle istisnaları yakalayabilirsiniz:

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

Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: http://www1.maths.lth.se/help/R/R.oo/


8
Hehe. R OO olmadan yeterince korkak değil mi? Flip için üzgünüm ve ilginç cevap için kesinlikle teşekkürler, ama yukarıdaki düz eski durağı () ile gidecek.
forkandwait

1
Artık daha fazla OO var. :)
Iterator

3
@ws. R hakkında bu kadar korkak olan ne? plotbir işlev çizer, try stop warnhepsi beklediğiniz gibi çalışır ve yapmak istediğim hemen hemen her şey tek astarlıdır.
isomorphismes

4
Genellikle "tek gömlekli güç" bir dil için iyi bir ölçü değildir. Birçoğumuz için okunabilir, anlaşılabilir kod daha az satır koyar. Gerçekten, benim için çok fazla şey anlaşılmaz çünkü ben bir acemiyim ve beklentileri buna göre ayarlamaya çalışıyorum. Ancak diğer diller, 0'dan işlerin yapılmasına kadar oldukça sezgiseldir. R ayrıca zeki, okunması zor tek katmanlı bir kültür geliştirmiş gibi görünüyor. Ruby gibi çoğu zaman tek katmanlı olabilen maksimum İngilizce benzeri kod kültürünü savunacağım.
Philip

6

Aslında fonksiyon stopifnotkodunuzda akıl sağlığı kontrolleri uygulamak için çok uygundur. Birkaç mantıksal ifade alır ve bunlardan herhangi biri yanlış olarak değerlendirilirse bir hata döndürür.

Örnek: 'df' veri çerçevesinde 'c' sütununun bulunup bulunmadığını kontrol etmek için:

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

Bu, aşağıdaki hatayı atar:

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

Python'un sesi gibi assert(...)...
Josiah Yoder

1

Sütunun var olup olmadığını kontrol edebilir ve istediğinizi yapabilirsiniz.
Diyelim ki data.frameadlandırılmış df1ve sütunun col1olup olmadığını kontrol edin :

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

veya

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

Örneğin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.