この質問は、次のdata.table
バグ レポート - #4978から生じていますが、これが特定の問題data.frame
ではないことを示すために例を使用します。data.table
次の点を考慮してください。
df = data.frame(a = 1, hø = 1)
identical(names(df), c("a", "hø"))
#[1] TRUE
.Internal(inspect(names(df)))
#@0x0000000007b27458 16 STRSXP g0c2 [NAM(2)] (len=2, tl=0)
# @0x000000000ee604c0 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "a"
# @0x0000000007cfa910 09 CHARSXP g0c1 [gp=0x21] [cached] "hø"
.Internal(inspect(c("a", "hø")))
#@0x0000000007b274c8 16 STRSXP g0c2 [] (len=2, tl=0)
# @0x000000000ee604c0 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "a"
# @0x0000000007cfa970 09 CHARSXP g0c1 [gp=0x24,ATT] [latin1] [cached] "hø"
2 つが同一であると考えられていてもidentical
、基になる文字列キャッシュは「hø」を 2 つの異なる場所に格納し、「a」を 1 つの場所に格納することに注意してください。何が起こっている?これは R 文字列キャッシュのバグですか?
そして、これが重要な理由は、%chin%
ここで失敗することです (上記の不一致のため):
library(data.table)
"a" %chin% names(df)
#[1] TRUE
"hø" %chin% names(df)
#[1] FALSE