戯言日記

Rの話だと思ったら唐突にサバゲーが混じってくる何か。

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関連のアレコレについてはこれまで調べたことがなかったので、こちらを参照しつつ確認した。

notchained.hatenablog.com

> 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を眺めていたら似たような事例があった。

github.com

中国語でのディレクトリ関連の文字化けについてだが、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の表示)。
バージョンアップが来たら即座にやった方が良さそう。



  1. dir()を走らせてみると「メモ.txt」が「繝。繝「.txt」に文字化けしたので、UTF-8がデフォルトにならない限り回避不能なトラブルな気がしてきた……。

  2. 観測した範囲だと、gsub()が上手く機能しない事例(https://github.com/rstudio/rstudio/issues/10294)とかも若干近い内容な気がする。