RStudioの最新バージョンで`str_c()`の挙動がおかしい
概要
RStudioを最新版に更新して、さて解析するかと意気込んでいたら、どでかい地雷を踏んだ。
> library(tidyverse) > str_c("文字", "化け") [1] "\u0095�\u008e\u009a\u0089�\u0082�"
日本語の結合がおかしなことになっている。
簡単に検証
確認すると、str_flatten()
やstr_detect()
などの挙動もおかしくなっている。
全部確認した訳ではないが、stringr
パッケージは全部ダメかもしれない(もしくは、確認してないけどstringi
パッケージ系?)。
> str_flatten(c("文字", "化け")) [1] "\u0095�\u008e\u009a\u0089�\u0082�" > str_detect(c("文字", "化け"), "文字") [1] TRUE TRUE
RStudioの更新前は普通に動いていたのと、試しにRguiで走らせてみると普通に出力されたので、やはりRStudioが原因っぽい。
という訳でRStudioの設定を見直したが、エンコードはどこもUTF-8にしてあるのでぱっと見だと問題はない。
しかも、むしゃくしゃしてpaste0()
を使ったら何故か通る。なんでさ。
> paste0("文字", "化け") [1] "文字化け"
あと、str_conv()
でエンコードすると普通に表示されるので、関数内で処理する時に何か挟んでいるのかもしれない。
> str_c("文字", "化け") %>% str_conv("shift-jis") [1] "文字化け"
一応ロケールを表示。いやまぁpaste0()
が通っちゃってるのでここが原因ではないとは思うのだが。
なお、locale関連のアレコレについてはこれまで調べたことがなかったので、こちらを参照しつつ確認した。
> Sys.getlocale() [1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"
何となく軽い気持ちでロケールを英語に変更して走らせてみる。
> Sys.setlocale("LC_ALL", "English_US") [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252" > str_c("文字", "化け") [1] "文字化け"
そこは通らないで欲しかった。
GitHubで確認
事ここに至って、どうあがいても自分の手に余る状況になったので、諦めてGitHubを眺めていたら似たような事例があった。
中国語でのディレクトリ関連の文字化けについてだが、RStudioのバージョンアップで発生してるところとかも同じなので、たぶん根幹の部分は同じ気がする1。
他にもちょこちょこロケール絡みのバグはあるっぽい2が、UTF-8が標準になるR4.2へのアップデートで解決する(らしい)ので、しばらくは待機するしかないかもしれない。
結論
現状だと、RStudioのアップデートはよく考えた上でやった方が良さそう。
Enjoy!
追記(2022/02/05)
readr::read_csv()で日本語のフォルダ内に格納したファイルを読もうとしたら、ファイルパスが文字化けしてエラーになった。
data.table::fread()では普通に読み込めたので、もしかするとtidyverse系の処理と相性が悪いのかもしれない。
さらに追記(2022/02/11)
開発版であるR-devel(R 4.2相当)で確認したところ、str_c()での日本語の処理に問題がなかった(Sys.getlocale()で確認したところUTF-8の表示)。
バージョンアップが来たら即座にやった方が良さそう。
-
dir()
を走らせてみると「メモ.txt」が「繝。繝「.txt」に文字化けしたので、UTF-8がデフォルトにならない限り回避不能なトラブルな気がしてきた……。↩ -
観測した範囲だと、gsub()が上手く機能しない事例(https://github.com/rstudio/rstudio/issues/10294)とかも若干近い内容な気がする。↩