なんでしょうね
ちょっとkuniezu
パッケージを試してみたかったんですが、
内部で使ってるparzer
パッケージがエラー吐いて止まる(Win、32bit版)か止まってしまって処理が返ってこない(Win, 64bit版)という挙動をしていました。
再現できるコードはこれ。
parzer::parse_lon("10")
RToolsは4.0の最新版を入れなおしてもダメでした。一方、Ubuntu上では問題なく動作して、結果として一個前の記事が出来ました(ヨカッタネ)
ってことをTwitterに呟いていたら、僕らのユタ兄さんから、
Sys.setlocale(locale = "C") にすると動きますね。この現象、arrowパッケージでも見たのでなんかあるんだろうと思ってるんですが原因を突き止められていません。。
— Hiroaki Yutani (@yutannihilation) 2021年1月23日
というアドバイスをいただいて、上記コード実行前に
Sys.setlocale(locale = "C")
をしたら動くようにはなりました。が、原因がわからないのでちょっと調べてみます。昔のバージョンなら問題なかったのではないだろうか、とかそのあたりですね…(CRANのテストはもちろん通った状態でリリースされているのでそこら辺ではなさそう)
続報
その後、std::regex
が問題とわかり…
どうもstd::regexがだめっぽいですhttps://t.co/bZY62rHXDc
— Hiroaki Yutani (@yutannihilation) 2021年1月23日
minimal reprexhttps://t.co/Ylmi0fMrtR
結局、gccに問題があるのではということまで来ました(主にユタ兄さんの解析によって)
GCC側で直さないとだめ、という話になってるっぽいです。 https://t.co/SWetVPGB7B
— Hiroaki Yutani (@yutannihilation) 2021年1月24日
現状では先にあげたように、localeを設定してやり過ごすのが対策になりそうです。ちなみに、regexは[]
がダメっぽくて、[0]
はダメ、(a+)*\d
みたいなのはOKでした。こんなこと(コンパイラのバグ)ってあるんですねぇ…(Windowsの日本語localeのみで発生するregexのバグ…)
ちなみに、Windows上でSys.getlocale()
するとこうなります。この環境下でのみ発生する、という感じですね(ubuntuのutf8環境では問題なかった)
> 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"