Bu gerçekten bir hatadır ve fixed in 3.3.1 idi.
davranış aslında %in%
sol tarafında bir eleman varken sadece FALSE
olsun ki, senin örnek gösterir biraz daha daha garip olan:
> a %in% b
[1] FALSE
> c(a, a) %in% b
[1] TRUE TRUE
yorumlarla ima edildiği gibi %in%
sadece match
çağırır, böylece sorun da orada görülebilir:
> match(a, b)
[1] NA
> match(c(a, a), b)
[1] 1 1
önemli argümanları %in%
ve match
vardırve table
, burada her iki işlev de table
'da x
arar. Kaputun altında, R unique.c
'da tanımlanan match5
işlevinde bunu yapar. Birden fazla x
, match5
olması durumunda, hızlı aramaları etkinleştirmek için table
bir karma tablo yaratacaktır. Kodu kazarsanız, karşılaştırmanın sequal
isimli bir işlevde olduğunu görürsünüz, bu da Seql(STRING_ELT(x, i), STRING_ELT(y, j))
'u döndürür (iyi, aslında bundan biraz daha karmaşıktır *). Eğer memory.c
yılında Seql
bakmak giderseniz Sonra şunları bulacaksınız:
gördüğünüz gibi, UTF-8'e dizeleri dönüştürür,
int result = !strcmp(translateCharUTF8(a), translateCharUTF8(b));
.
x
sadece bir eleman varsa Ancak, biz sadece x
varsa bir kez görmek için table
aracılığıyla tarayabilir beri bir karma tablo oluşturma sorun geçmesi saçma. 3.3.0'da, x
ve table
öğelerinin her biri için eşitliği denetleme kodu Seql
kullanmamış ve dizeyi UTF-8'e dönüştürmemiştir. Ancak 3.3.1'den başlayarak, Seql
kullanılır, bu nedenle davranış sabittir.
* Dize eşitliği hakkında bir kenara: R aslında dizeleri önbelleğe alacaktır, böylece bir kopya kopyalamak zorunda kalmaz. Yani eğer iki dizgiler aynı yerde ise, eşittirler ve daha fazla kontrol etmeye gerek yoktur!
> .Internal(inspect("Köln"))
@10321b758 16 STRSXP g0c1 [NAM(2)] (len=1, tl=0)
@106831eb8 09 CHARSXP g1c1 [MARK,gp=0x28,ATT] [UTF8] [cached] "Köln"
> .Internal(inspect(b))
@106831cd8 16 STRSXP g1c1 [MARK,NAM(2)] (len=1, tl=0)
@106831eb8 09 CHARSXP g1c1 [MARK,gp=0x28,ATT] [UTF8] [cached] "Köln"
'% c (a, b) '' de geçerlidir Encoding' bir% -?' Maç, pmatch, UTF-8 charmatch, çoğaltılmış ve benzersiz her maç elemanlarının herhangi olarak işaretlenmiş ise UTF-8.' – rawr
Ve '==' için belgeler, karakterlerin karşılaştırmadan önce UTF-8'e dönüştürüldüğünü söylüyor ... Neden farklı davranıyor olsa da merak ediyorum. – joran
@rawr Eh evet, ama 'a' c (a)' dır, yani aynı zamanda c (a, b) 'de. Ama neden c (a) 'da değil? % '%', değişken ismin aynı olmadığını, sadece değerlerin olduğunu ve değerlerin = = '' '' '' '' '' '' '' '' '' '' '' '' '' döndürdüğü için neden aynı olmadığını anlamıyorum. – RoyalTS