Cevap
Ah, bu basit sorunun cevabını bulmak 45 dakikamı aldı. Cevap:grepl(needle, haystack, fixed=TRUE)
# Correct
> grepl("1+2", "1+2", fixed=TRUE)
[1] TRUE
> grepl("1+2", "123+456", fixed=TRUE)
[1] FALSE
# Incorrect
> grepl("1+2", "1+2")
[1] FALSE
> grepl("1+2", "123+456")
[1] TRUE
yorumlama
grep
bir kısaltmadır kendisi de linux yürütülebilir almıştır " G loblu R egular E XPression P rint", bu girişin satırları okuyup onlar verdi argümanlar eşleşirse sonra onları basacaktır. "Global", eşleşmenin giriş satırının herhangi bir yerinde gerçekleşebileceği anlamına geliyordu, aşağıda "Normal İfade" yi açıklayacağım, ancak fikir, dizeyle eşleşmenin daha akıllı bir yoludur (R, bu "karakteri" olarak adlandırır class("abc")
) ve "Yazdır "çünkü bu bir komut satırı programıdır, çıktı yayan çıktı çıktı dizesine yazdırır
Şimdi, grep
program temel olarak giriş hatlarından çıkış hatlarına bir filtredir. Ve R'nin grep
işlevi benzer şekilde bir dizi girdi alacak gibi görünüyor . Benim için tamamen bilinmeyen nedenlerden dolayı (R ile sadece bir saat önce oynamaya başladım), bir eşleşme listesi yerine eşleşen dizinlerin bir vektörünü döndürür.
Ancak, orijinal sorunuza geri dönersek, gerçekten istediğimiz şey iğneyi samanlıkta bulup bulmadığımızı bilmek, doğru / yanlış bir değer. Görünüşe göre bu işlevi grepl
"grep" de olduğu gibi " L ogical" dönüş değeriyle adlandırmaya karar verdiler (örn class(TRUE)
. Doğru ve yanlış mantıksal değerleri çağırırlar ).
Şimdi, adın nereden geldiğini ve ne yapması gerektiğini biliyoruz. Düzenli İfadelere geri dönelim. Argümanlar, dize olmasına rağmen, düzenli ifadeler oluşturmak için kullanılırlar (bundan böyle regex). Normal ifade, bir dizeyle eşleşmenin bir yoludur (bu tanım sizi rahatsız ediyorsa, bırakın). Örneğin, normal ifade a
karakterle eşleşir, "a"
normal ifade 0 veya daha fazla a*
karakterle eşleşir "a"
ve normal ifade 1 veya daha fazla a+
karakterle eşleşir "a"
. Bu nedenle yukarıdaki örnekte, aradığımız iğne 1+2
, normal ifade olarak tedavi edildiğinde "bir veya daha fazla 1 ve ardından 2" anlamına gelir ... ama bizimki bir artı takip ediyor!
Yani, grepl
ayar olmadan kullandıysanız, fixed
iğneleriniz yanlışlıkla haystacks olurdu ve bu yanlışlıkla oldukça sık işe yarardı, OP örneği için bile işe yaradığını görebiliriz. Ama bu gizli bir hata! Girişin bir dize olduğunu söylemeliyiz, regex değil, görünüşe göre ne fixed
için. Neden düzeltildi? Hiçbir ipucu, bu cevap b / c imi muhtemelen ezberlemeden önce 5 kez daha bakmak zorunda kalacak.
Son birkaç düşünce
Kodunuz ne kadar iyi olursa, onu anlamak için o kadar az geçmişe sahip olmanız gerekir. Her argümanın en az iki ilginç değeri olabilir (aksi takdirde bir argüman olması gerekmez), dokümanlar burada 9 argümanı listeler, yani çağırmak için en az 2 ^ 9 = 512 yol vardır, bu çok iş yazma, test etme ve hatırlama ... bu tür fonksiyonları çözme (bölme, birbirine bağımlılıkları kaldırma, dize işleri regex şeylerinden vektör şeylerinden farklıdır). Bazı seçenekler de karşılıklı olarak münhasırdır, kullanıcılara kodu kullanmaları için yanlış yollar vermeyin, yani sorunlu çağırma mantıksal olarak mantıksız olmayan (yapısal olarak anlamsız (var olmayan bir seçeneği geçmek gibi) olmalıdır açıklamak için bir uyarı verin). Mecazi olarak koyun: 10. katın yan tarafındaki ön kapıyı bir duvarla değiştirmek, kullanımına karşı uyaran bir işaret asmaktan daha iyidir, ancak her ikisinden de daha iyi değildir. Bir arabirimde, işlev, arayanların değil, argümanların nasıl görünmesi gerektiğini tanımlar (çünkü arayan işleve bağlıdır, herkesin onu aramak isteyebileceği her şeyi çıkarırsa, işlev de arayanlara da bağlıdır ve bu tür döngüsel bağımlılık bir sistemi hızla tıkar ve asla beklediğiniz faydaları sağlamaz). Kesinti türlerine karşı çok dikkatli olun, bu tür şeylerin herkesin onu aramak isteyebileceği her şeyi çıkarmak, işlevi arayanlara da bağımlı hale getirir ve bu tür döngüsel bağımlılık, bir sistemi hızla tıkar ve asla beklediğiniz faydaları sağlamaz). Kesinti türlerine karşı çok dikkatli olun, bu tür şeylerin herkesin onu aramak isteyebileceği her şeyi çıkarmak, işlevi arayanlara da bağımlı hale getirir ve bu tür döngüsel bağımlılık, bir sistemi hızla tıkar ve asla beklediğiniz faydaları sağlamaz). Kesinti türlerine karşı çok dikkatli olun, bu tür şeylerinTRUE
ve 0
ve "abc"
hepsi vektörlerdir.
fixed=TRUE
, aksi takdirde bir dize yerine normal ifade olarak davranıyorsunuz. Ekim 2016'dan cevabımı görün.