9

この質問は、次の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
4

1 に答える 1

8

"hø"コンソールに直接出力すると、UTF-8 エンコーディングとしてマークされます。を使用して強制的にネイティブにすることができenc2native、この問題は解消されますが、これがなぜなのかはまだ解明中です...

Encoding("hø")
# [1] "UTF-8"

.Internal( inspect( c( "a" , enc2native("hø") ) ) )
#@1081d60a0 16 STRSXP g0c2 [] (len=2, tl=0)
#  @100af87d8 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "a"
#  @1081e3a08 09 CHARSXP g1c1 [MARK,gp=0x21] [cached] "hø"

enc2native("hø") %chin% names(df)
#[1] TRUE

Encodingヘルプページには多くの関連情報があります。私はこれが関連するでしょう:

明示的に設定する以外に、文字列が宣言されたエンコーディングを取得する方法は他にもあります (R が進化するにつれて、これらは変更されました)。関数 scan、read.table、readLines、および parse には、エンコーディングを宣言するために使用される encoding 引数があり、iconv はその from 引数からエンコーディングを宣言し、適切なロケールでのコンソール入力も宣言されます。intToUtf8 はその出力を「UTF-8」として宣言し、適切なロケールで実行されている場合、出力テキスト接続 (textConnection を参照) がマークされます。状況によっては (ヘルプ ページを参照)、source(encoding=) は、出力する文字列のエンコーディングをマークします。

アップデート

基本的な ASCII 文字 (文字コード 0 ~ 127) セットのすべてがエンコーディングを取得し、拡張 ASCII コード (文字コード 128 ~ 255) を含め、"unknown"これ以外の文字はデフォルトで設定されるようです。"UTF-8"

于 2013-10-08T21:02:40.230 に答える