R Presentation ファイル(.Rproj)は knitr::knit() でmarkdownに変換されてPreviewされる.
knitr::knit()
処理の流れは,
- 引数
encodingの判定・および変換 readLines()で読み込み- 拡張子の判定
ChunkもしくはInline codeが含まれているかどうかの判定cat()もしくはwriteLines()で出力
となる.
encoding の判定
プロジェクトの場合は,プロジェクトのエンコーディングでknitr::knit() が呼び出された後,
に引数が変換される.
プロジェクトではない場合は,encoding = "UTF-8" で呼び出され,プロジェクトの場合と同じように引数が変換される.
readLines() で読み込み
- 判定した
encodingで読み込む - ここで cp932 のファイルを UTF-8 指定で読み込むと,読み込みに失敗して,結果的に変換に失敗したように見える
- UTF-8 のファイルは,UTF-8 もしくは
''でしか読み込まれないので,読み込みに失敗することはない
拡張子の判定
拡張子 .Rpres は all_patterns に含まれていない
Chunk もしくは Inline codeの判定
```{r}
```
もしくは
`r `
が含まれていたら,writeLines(),含まれていなかったら cat() で出力される.
writeLines() は encoding が指定できるので,encoding = '' もしくは encoding = "UTF-8" で出力される.
cat() はファイル名をわたした場合 encoding 指定できないが, (出力する文字列の) Encoding()がunknown どうかで挙動が変わって,
- UTF-8 のファイルを
readLines(file("filename", encoding = "UTF-8"))を使って読み込んだ時は,Encoding()が UTF-8になって,cat()すると cp932 で出力される encoding = ""で読み込んだ場合はEncoding()が unknown で UTF-8 で出力される- (ちなみに,CP932 のファイルを CP932 指定で読むと
Encoding()が UTF-8 になって,cat()すると CP932 で出力される) - (指定しないで読み込むと CP932 で出力される)
cat() するのがよくないのと,cat()でファイル名をわたすのがよくない気がする.
なので,.Rpres を all_patterns に加える,もしくは,cat() にfile() をわたしてencodingを指定するのがよいと思うが,別のとこに影響出るんだろうか.
以下実験
プロジェクトではない場合
新規作成
デフォルトエンコーディングで .Rproj ファイルが作成される
Preview
デフォルトエンコーディングに関係なく,
Chunk もしくは inline code なし
.Rprojが UTF-8.mdはcp932- Preview は文字化け
.Rprojが cp932.mdは変換に失敗,日本語が出現するところまでの部分が出力される.多分cp932.
Chunk もしくは inline code あり
.Rprojが UTF-8.mdはUTF-8- Preview は文字化けしない
.Rprojが cp932.mdは変換に失敗,日本語が出現するところまでの部分が出力される.多分cp932.
プロジェクトの場合
新規作成
プロジェクト設定のエンコーディングで .Rproj ファイルが作成される
Preview
プロジェクト設定のエンコーディングが UTF-8,Chunk もしくは inline code なし
.Rprojが UTF-8.mdはcp932- Preview は文字化け
.Rprojが cp932.mdは変換に失敗,日本語が出現するところまでの部分が出力される.多分cp932.
プロジェクト設定のエンコーディングが UTF-8,Chunk もしくは inline code あり
.Rprojが UTF-8.mdはUTF-8- Preview は文字化けしない
.Rprojが cp932.mdは変換に失敗,日本語が出現するところまでの部分が出力される.多分cp932.