2015-04-24 22 views
8

R, çoğu kabuk betikleme diline benzer davranışlarla birlikte hata işlemeye yönelik olarak çok yanlış bir tutum sergiliyor gibi görünüyor. Bunun da ötesinde, R terminaline bol miktarda masum metin basmaya meyillidir. Bu, hataların fark edilmeden gitmesini kolaylaştırır. Bir kereden fazla bir senaryoda, hataları önceden oluşturuyor ve NaN'leri hesaplamanın geri kalanı boyunca mutlu bir şekilde yayıyor. Sadece bir süredir tuhaf sonuçların üzerine kafa karıştırdıktan sonra ne olduğunu anladım.R gürültüsünde ve gürültülü hatalarda hata yapma

Deneyimli R kullanıcıları bununla nasıl ilgileniyor? Hataların ölümcül veya daha az fark edilebilir olması için bir yol var mı?

+2

Bu aynı zamanda, borunun nasıl olduğu ve uyum sağlamanız ve öğrenmeniz gereken yoldur. Çoğunlukla işlevsel bir programlama yaklaşımıyla, kodunuzu küçük işlevlere ayırın ve her zaman giriş/çıkış olarak bir NA - Nan değeri ve bunu nasıl yöneteceğiniz konusunda düşünün. Bu arada şunu da belirtebilirsiniz: 'R terminalde çok sayıda masum metin yazdırmaya meyillidir '. Anlamıyorum. Ve bu ipucunda 'kötü' bulduğunuzu yansıtan minimal bir örnek olmadan, tavsiye etmek zor olacaktır. Sorunuz çok geniş. –

+0

Kavramsal olarak, NaN'lerin hata olduğu varsayımını tercih ederim, böylece her zaman onları düşünmek zorunda kalmam. İstatistik odaklı bir dilde verdiğim verilerin bütünlüğünden sürekli olarak korkmam gerektiğine dair mantıksız görünüyor. Zararsız bir metin örneği olarak, başarılı bir şekilde yükleme paketleri, paketleri benim için yükleyen hataları gizlemek için yeterli çıktı üretir. Belki bu benim için daha açık olmalıydı, ama bazı günler yorgunum ve değil. – Praxeolitic

+0

Başarıyla yüklenen paketleri neden hatalı görmeyecek görmüyorum. Bir hata olursa, tanım gereği programınız R olarak durur. Eğer hallederseniz hariç. Ama yine de, düşüncelerinizi yansıtan sentetik bir minimal örnek verebilir misiniz? –

cevap

2

Bazı insanların yaptığı bir şey hataları atmak ayarlanmış tüm uyarılara ile Ar çalıştırmak olduğunu biliyoruz:

options(warn = 2) 
> x <- "a" 
> as.numeric(x) 
Error: (converted from warning) NAs introduced by coercion 
> sqrt(-1) 
Error in sqrt(-1) : (converted from warning) NaNs produced 

Açıkçası, bu bölümünde tat meselesidir. Ancak, bu yaklaşımı benimsemenin de, yazarların, neyin bir uyarı üretmesi gerektiğine dair makul bir tanımına sahip olabileceği ya da olmayabileceği paketlerden gelen tüm uyarıları içereceğini bilmelisiniz. Yani gerçekten umursamadığınız birçok uyarı üreten kodla karşılaşabilirsiniz.

Ardından, önem vermediğiniz kararları açıkça silmeniz için suppressWarnings ifadelerinde bulunan sarma ifadelerine dönmeniz gerekir.

0

Başka bir dil öğrenmeden önce R ile programlama yapmaya başladım. Kısa bir süre sonra, bir senaryoyu denemek ve yazmak için kötü bir fikir olduğunu öğrendim ve sonra sadece çalışmasını umuyordum. Yazacak amaçlanan bir senaryonun giriş ve çıkış ve nihai hedef aşağı

  1. yaz: Bunun yerine, bu süreci takip edecek.
  2. Bunu adım adım komut satırı arabirimi adım kullanarak gerçekleştirmeye çalışın.
  3. # 2 ile başarılı olduktan sonra R Studio'daki Geçmiş sekmesinden istenen sonucu üretmek için gereken tüm satırları toplayın.

enter image description here

  1. Testi senaryoyu ve optimizasyonlar yapmak için deneyin.

Bu şekilde, her satırın kendi isteğinizi yerine getirdiğini görmek için 'u kontrol edebilirsiniz. hatasız bu çalıştırır

MyVec = c(2, 4, 3, 5) 
for(i in MyVec) 
{ 
    Sum = Sum + MyVec[i] 
} 
Average = Sum/length(Sum) 

Not ve yanlış sonuç üretir:

Çok sık insanlar gibi bir şey yapacağız burada nerede soruları görmek! onlar sadece çalıştırmak için zaman alacağını ise:

for(i in MyVec) 
{ 
    print(i) 
} 

Onlar (a) hata ve (b) R nasıl çalıştığı hakkında biraz bilgi görecekti!

+1

Buna test odaklı geliştirme denir. Esasen. Ya da, onu aramak gibi, "kanlı sağduyu"! –

+0

Bu, kesinlikle * test * değil normalde test odaklı geliştirme denir. Özellikle, TDD savunucuları normal olarak herhangi bir gerçek kodu yazmadan önce bir test * yazmayı önerirler. Döngü: kod yazmak, kod yazmak, daha ziyade: mevcut kodu kırmak için gerekli minimum testi yazmak, * daha sonra testi geçmek için gerekli olan minimum kodu yazınız (gerektiğinde tekrarlayınız). –

+0

Bir komut dosyasına yazıyorum, gerekirse konsolda doodle ve "derleme" olduğundan emin olmak için betiği temiz (veya knitr/markdown kullanarak) çalıştırın. Normalde derlenmiş bir dilde ve sizin yolunuzda yapılabilecekler arasında bir tür melez. –

İlgili konular