R, neden `[` daha iyi `alt`?
Bir veri süzmek istiyorum.çerçeve, yani, belirli koşulları karşılayan satırları ayıklamak, subset
işlevi kullanmayı tercih ederim:
subset(airquality, Month == 8 & Temp > 90)
yerine [
fonksiyon:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
Benim tercih için iki ana nedeni vardır:
- Kodu daha iyi okur, sağdan sola doğru buluyorum. Hatta R hakkında hiçbir şey bilmeyen insanlar
subset
yukarıdaki açıklama yaptığını söyleyebilir. - Sütunlar
select
ifadede değişkenler olarak adlandırılır, çünkü, bir kaç tuşa basarak kurtarabilirim. Benim örnekte, ben sadecesubset
ama[
ile üç kez yazınairquality
Bir zamanlar vardı.
Mutlu bir hayat, daha kısa ve daha iyi okur çünkü her yerde subset
kullanarak, hatta adam R benim kodlayıcıları için güzelliği savunan bendim. Ama dün benim dünyam ayrı kırdı. subset
belgeleri okurken, bu bölüm fark ettim:
Uyarı
Bu kolaylık bir fonksiyonu etkileşimli olarak kullanmak için tasarlanmıştır. Daha iyi standart gömmeyi işlevleri gibi kullanmak programlama için [ve özellikle değişken standart dışı değerlendirme alt beklenmedik sonuçları olabilir.
Birine yazar demek istediğimi açıklamak yardımcı olabilir mi?
Onlar derken ne demek istiyorsunuz " . ilk ^em>etkileşimli olarak kullanmak için"? TOPLU modunda komut çalıştırmak için farklı olarak etkileşimli bir oturumun ne olduğunu biliyorum, ama yapmak gerekir anlamıyorum.
, Açıklar mısınız " . sonra ^em>bağımsız değişken alt kümesinin standart dışı bir değerlendirme" ve neden tehlikeli, belki bulunur bir örnek?
Teşekkür ederim!
CEVAP
Bu soru @James, subset
tehlikelerin Hadley Wickham (ve bunun gibi işlevleri) tarafından mükemmel bir açıklama gösteren [here] yorumlar iyi cevap oldu. Oku!
Biraz uzun, okumak, burada Hadley en doğrudan soru adreslerini kullanan bir örnek kaydetmek için yararlı olabilir, böylece "ne yanlış gidebilir ki?":
Hadley aşağıdaki örnek göstermektedir: alt ve veri çerçevesi aşağıdaki işlevleri kullanarak yeniden düzenlemek istiyoruz varsayalım:
scramble <- function(x) x[sample(nrow(x)), ]
subscramble <- function(x, condition) {
scramble(subset(x, condition))
}
subscramble(mtcars, cyl == 4)
Bu hatayı döndürür:
Eval(ifade, çevre, enclos) hata: 'position' bulunamadı . nesne
R artık, çünkü "nesnesi olarak nerede"''. silindir bilir O da şans eseri bir nesne çağrılırsa olabilir orada gerçekten tuhaf şeyleri işaret 'position' küresel ortam:
cyl <- 4
subscramble(mtcars, cyl == 4)
cyl <- sample(10, 100, rep = T)
subscramble(mtcars, cyl == 4)
(Onları çalıştırmak ve kendiniz görün, çok çılgınca bir şey.)
Neden baskı "B" baskı " ...
Neden bir döngü iki döngü daha yavaş g...
Neden Standart girdiden okuma satır Py...
Neden Python kodunu daha hızlı bir işl...
Neden [] liste daha hızlı()?...