RMarkdown

とある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する場合には注意点があります。

  1. kable()関数の制限:
    • kable()はデフォルトでシンプルなテーブルを作成しますが、Word形式で高度なテーブルを作成する際にはカスタマイズが限られており、Word出力ではテーブルのスタイルや複雑なフォーマットが正しく反映されないことがあります。
    • シンプルなテーブルの場合はそのまま使えます。
    • 複雑なテーブルを作成したい場合はflextableやofficerパッケージを使用します。
  2. gtパッケージの問題:
    • gtパッケージはきれいなテーブルを生成しますが、Word出力に対応していない場合があります。
    • gtは主にHTMLやPDF出力で強みを発揮します。
    • Word出力を使う場合は、gtではなくflextableを使うのが一般的です。
  3. 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の中にテーブルが画像として挿入された。

Table

これなら、テーブルの装飾を残したまま、Wordに出力できる。

 



 

とゆーわけで、全てのテーブルを画像に変換し、無事Wordに出力した。