大まかに言えば、問題は次のとおりです: RNW ドキュメントで (または一般的には、マークダウン/HTML 出力を生成する関数)を使用する方法は?formattable
バックグラウンド
最初は、この回答で提案したアプローチを適用できると思いました。RNW ドキュメントにマークダウン マークアップを埋め込むことができます。しかし、結果としてformattable
、マークダウンと HTML の出力が混在して生成されます。この場合、そのアプローチは機能しません。
約 3 週間前、 fdetsch は RNW ドキュメントに埋め込む方法(または一般的には s)を示す素晴らしい回答を投稿しました。この回答は、fdetchのソリューションに基づいて構築および拡張されています。leaflet
htmlWidget
ソリューション(生)
GitHub からライブラリをインストールし、webshot
必要に応じdevtools
てhtmlwidgets
.
devtools::install_github("wch/webshot")
- の戻り値を
formattable
オブジェクトに保存します (私は を使用しましたmytable
)。
mytable
に変換htmlWidget
:as.htmlwidget(mytable)
ウィジェットを一時 HTML ファイルに保存します (現在の作業ディレクトリにある必要があります。以下を参照してください)。
tmpHTML <- basename(tempfile(fileext = ".html"))
saveWidget(as.htmlwidget(mytable), file = tmpHTML)
HTML ファイルの「スクリーンショット」を撮ります。ファイル名の代わりにパスを渡すと、何らかの理由でwebshot
空の画像ファイルが生成されます。
myImage <- "image.pdf"
webshot(tmpHTML, file = myImage, cliprect = "viewport")
図をドキュメントに追加します。
knitr::include_graphics(myImage)
問題と改善
- 問題 1: ウィジェットに対して画像が大きすぎます。これはto
selector = "#htmlwidget_container"
の代わりに渡すことで解決できるはずですが、私のテストではうまくいきませんでした。または、のクロッピング メカニズムを使用するために直後に追加することもできます。cliprect = "viewport"
webshot
plot_crop(myImage, quiet = TRUE)
webshot
knitr
- 問題 2: 何らかの理由で、生成された PDF が白黒です。スクリーンショットを PNG として保存すると、色が保持されます:
myImage <- "image.png"
. ただし、フォントがぼやけてしまい、解像度を上げる方法が見つかりませんでした (webshot
議論vwidth
は役に立ちません)。したがって、これはトレードオフだと思います。ぼやけていないフォント (PDF) または色 (PNG) のいずれかを使用できます。
- 問題 3: 乱雑な一時ファイル。必要に応じて追加
unlink(tmpHTML)
できます。
完全な例
\documentclass{article}
\begin{document}
<<>>=
library(htmlwidgets)
library(webshot)
library(formattable)
# Data from the question
df <- data.frame(
Typ = c("Winners", "", "Losers", ""),
Time = c("1.", "2.", "1.", "2."),
Value = percent(c(0.22, 0.18, 0.78, 0.82)),
Change = percent(c(NA, -0.04, NA, 0.04))
)
mytable <- formattable(df, list(Change = formatter(
"span",
style = x ~ style(color = ifelse(x < 0 , "red", "green")),
x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x)
)))
tmpHTML <- basename(tempfile(fileext = ".html"))
saveWidget(as.htmlwidget(mytable), file = tmpHTML)
myImage <- "image.pdf"
webshot(tmpHTML, file = myImage, cliprect = "viewport")
plot_crop(myImage, quiet = TRUE)
knitr::include_graphics(myImage)
unlink(tmpHTML)
@
\end{document}