这个问题源于以下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ø"
请注意,尽管identical
认为两者相同,但底层字符串缓存将“hø”存储在两个不同的位置,而将“a”存储在一个位置。怎么了?这是一个 R 字符串缓存错误吗?
这很重要的原因是%chin%
在这里失败(由于上述差异):
library(data.table)
"a" %chin% names(df)
#[1] TRUE
"hø" %chin% names(df)
#[1] FALSE