とあるR Markdownファイルをdocx形式で出力しようとしたところ、以下のエラーが発生した。
Error: Functions that produce HTML output found in document targeting docx output.
HTML出力を行う関数がdocx出力を行うドキュメントに含まれているため、エラーが発生しているとのこと。
これ、YAMLヘッダーにalways_allow_html: true
を追加しても解決しない。
じゃあ、どうする?
Word出力でエラーがでる原因
このエラー、HTMLで出力するときには発生しない。
少し調べると、Wordでサポートされていないコードが含まれていることが原因のよう。
今回のエラーは、どうやらテーブル作成のコードにあるもよう。
こちらがChatGPT先生の回答。
RMarkdownでテーブルを作成する際に、knitrパッケージのkable()関数やgtパッケージ、flextableパッケージなどを使う方法があります。ただし、Wordファイル(.docx)にKnitする場合には注意点があります。
- kable()関数の制限:
- kable()はデフォルトでシンプルなテーブルを作成しますが、Word形式で高度なテーブルを作成する際にはカスタマイズが限られており、Word出力ではテーブルのスタイルや複雑なフォーマットが正しく反映されないことがあります。
- シンプルなテーブルの場合はそのまま使えます。
- 複雑なテーブルを作成したい場合はflextableやofficerパッケージを使用します。
- gtパッケージの問題:
- gtパッケージはきれいなテーブルを生成しますが、Word出力に対応していない場合があります。
- gtは主にHTMLやPDF出力で強みを発揮します。
- Word出力を使う場合は、gtではなくflextableを使うのが一般的です。
- Word出力に必要なパッケージ(officerやflextableなど)がインストールされていない場合、エラーが発生することがあります。
結論
- シンプルなテーブルならkable()でも問題ありません。
- 高度なフォーマットやWord出力用のテーブルを作成する場合は、flextableやofficerを使うことをおすすめします。
- Knit時に問題があればエラーメッセージを確認し、関連パッケージのインストールや設定を見直してください。
私の場合は、kableExtra::kbl
で、テーブルに色々装飾したのがひっかかったよう。
df_6h <- data.frame("1"=c("Cont-1","LPS-1"), "2"=c("Cont-2","LPS-2"), "3"=c("Cont-3","LPS-3"))
rownames(df_6h) <- c("A:Cont", "B:LPS" )
colnames(df_6h) <- c("1","2","3")
tb_6h <- kableExtra::kbl(df_6h, align="c", caption="LPS treatment 6h (6 well plate)" ) %>%
kable_styling(full_width = F) %>%
column_spec(1,background="#CCC") %>%
row_spec(0,background="#CCC")
これを解決する方法を2つばかり検討した。
解決策1: Word出力用の関数を使う
Word出力用の関数を使うことで、エラーを回避できる。
例えば、kableExtra::kbl
でも、極力装飾を避けて使用するとか、flextable::flextable
を使うとか。
・
・
・
一応、超シンプルなテーブルにすることでwordにknitできるようになった……けど、せっかく作ったテーブルがわかりにくくなるのはなんだか悲しい。
解決策2: テーブルを一度図に出力して読み込む
もう一つの方法は、作ったテーブルを一度画像に出力して、それをWordに読み込む、というもの。
例えば、webshot::webshot
を使って、テーブルを画像に出力するとか。
df_6h <- data.frame("1"=c("Cont-1","LPS-1"), "2"=c("Cont-2","LPS-2"), "3"=c("Cont-3","LPS-3"))
rownames(df_6h) <- c("A:Cont", "B:LPS" )
colnames(df_6h) <- c("1","2","3")
tb_6h <- kableExtra::kbl(df_6h, align="c", caption="LPS treatment 6h (6 well plate)" ) %>%
kable_styling(full_width = F) %>%
column_spec(1,background="#CCC") %>%
row_spec(0,background="#CCC")
# テーブルをHTMLファイルに保存
save_kable(tb_6h, file = "tb_6h.html")
# HTMLを画像に変換 (webshotパッケージを使用)
webshot("tb_6h.html", file = "./Export/tb_6h.png", vwidth = 300, vheight = 50, zoom = 1)
これで knitすると、Wordの中にテーブルが画像として挿入された。
これなら、テーブルの装飾を残したまま、Wordに出力できる。
・
・
・
とゆーわけで、全てのテーブルを画像に変換し、無事Wordに出力した。