write.csvでgsubのエラー

先日Rを触っていたら次のようなエラーが出た(という報告を受けた)。

Error in gsub("\"", qstring, col.names, fixed = TRUE) :
  input string 2 is invalid in this locale

状況としてはPostgreSQLのデータをdplyrでmutateしてwrite.csvに渡す際に発生していた。

発生したのはWindows環境で、macでは再現せず、Windowsでもなかなか再現しないので困っていたが、原因に見当がついたのでメモっておく。

結論としてはPostgreSQLのDBエンコーディングUTF-8だったのが原因らしい(cf. dplyr、PostgreSQL、Windows の組み合わせで文字化けを防ぐ - Qiita)。

mutateの際に列名に日本語を設定していたものだから、列名が文字化けしてwrite.csvのエラーにつながったらしい。つまり、次のようなことをすると起こる。

tbl(con, "table_name") %>%
    mutate(= 1
    ) %>%
    collect() %>%
    write.csv("file_name.csv")

mutateのところで日本語を渡してしまっているためか、client encodingをどうにかしても駄目だった。

先にcollectをするか、日本語のカラム名を使わないことで解決する。

tbl(con, "table_name") %>%
    collect() %>%
    mutate(= 1
    ) %>%
    write.csv("file_name.csv")