web-dev-qa-db-ja.com

rmarkdownからPDFをレンダリングするには、レンダリングの間にrstudioを閉じる必要があるのはなぜですか?

バックグラウンド

render()を使用してレンダリングされるrmarkdownドキュメントを作成しようとしています。 render呼び出しには、パラメーター化された2つの要素があります。

  • ユーザーがpdfまたはhtmlを指定できるようにしたいと思います。 output_format()を使用すると簡単です。
  • また、(kableExtraパッケージを使用して)テーブルがlatexであるかhtmlであるかを指定するパラメーターをドキュメントに渡したいと思います。

これはtest.Rmdと呼ばれるrmarkdownファイルです

---
title: "Title"
author: "Zzz Zzzzzz"
params:
  table_format:
    value
---

```{r setup}
knitr::opts_chunk$set(echo = FALSE)
library(knitr)
library(kableExtra)

options(knitr.table.format = params$table_format) 
```

## Test table

```{r cars}
if (params$table_format == "latex"){
kable(iris[1:100,], booktabs = T) %>%
  kable_styling(latex_options = c("scale_down")) 
}

if (params$table_format == "html"){
kable(iris[1:100,]) %>%
  kable_styling(bootstrap_options = c("striped", "hover"))  %>%
  scroll_box(width = "500px", height = "600px")
}


params$table_format
```

次に、ファイルをレンダリングするための2つの呼び出しを示します。

rmarkdown::render("test.Rmd", output_format = "pdf_document", params = list(
  table_format = "latex"
))


rmarkdown::render("test.Rmd", output_format = "html_document", params = list(
  table_format = "html"
))

問題

これで、新しいrstudioセッションを開くと、両方のrender呼び出しを問題なく実行できます。 .pdfまたは.htmlファイルのいずれかが作成されます。ただし、次に.pdfレンダリングを実行しようとすると再び次のエラーが発生します。

"C:/ Program Files/RStudio/bin/pandoc/pandoc" + RTS -K512m -RTS test.utf8.md --tolatex --from markdown + autolink_bare_uris + ascii_identifiers + tex_math_single_backslash --output test.pdf --template " C:\ Users\salbers\R\win-library\3.4\rmarkdown\rmd\latex\default-1.17.0.2.tex "--highlight-style tango --latex-engine pdflatex --variable graphics = yes --variable "geometry:margin = 1in"!未定義の制御シーケンス。\begin {tabular} {rrrrl}\toprule Sepal.Length&Sepal.Width&Pet ... l.267\end {tabular}}

pandoc.exe:生成エラーPDFエラー:pandocドキュメントの変換がエラー43で失敗しましたさらに:警告メッセージ:コマンド '"C:/ Program Files/RStudio/bin/pandoc/pandoc" +を実行していますRTS -K512m -RTS test.utf8.md --tolatex --from markdown + autolink_bare_uris + ascii_identifiers + tex_math_single_backslash --output test.pdf --template "C:\ Users\salbers\R\win-library\3.4\rmarkdown\rmd\latex\default-1.17.0.2.tex "--highlight-style tango --latex-engine pdflatex --variable graphics = yes --variable" geometry:margin = 1in "'のステータスは43でした

Htmlレンダリングは何度も何度も正常に機能します。 rstudioを閉じてからプロジェクトをローペンすると、PDFのレンダリングも正常に機能します。

質問

  • PDFでレンダリングされたrmarkdownドキュメントをrstudioの1回のセッションで2回レンダリングできない理由を誰かに教えてもらえますか?
  • 同様に、なぜrstudioはレンダリングの合間に閉じなければならないのですか?
15
boshek

2019-01-21更新:

ニットボタンとrender関数の大きな違いの1つは、ニットボタンは常に「新しい環境」で開始するのに対し、デフォルトではrender関数であるということです。 parent.env()で始まります。

_render(input, ..., envir = parent.frame(), ...)
_

関数のドキュメントでは、

_envir   
The environment in which the code chunks are to be evaluated 
during knitting (can use new.env() to guarantee an empty new 
environment).
_

したがって、レンダリング呼び出しにenvir = new.nev()を配置することで、knitボタンをクリックする動作をシミュレートできます。


元の回答:

うーん、最初に解決策を投稿しましょう。この動作を解決するには、yamlセクションに次のものを配置する必要があります。また、今週初めに開発バージョンに関数kableExtra_latex_packages()を追加して、次のテキストを表示しました。

_header-includes:
  - \usepackage{booktabs}
  - \usepackage{longtable}
  - \usepackage{array}
  - \usepackage{multirow}
  - \usepackage[table]{xcolor}
  - \usepackage{wrapfig}
  - \usepackage{float}
  - \usepackage{colortbl}
  - \usepackage{pdflscape}
  - \usepackage{tabu}
  - \usepackage{threeparttable}
  - \usepackage[normalem]{ulem}
_

なぜそのような奇妙な振る舞いがあるのか​​興味があるなら、ここに簡単な説明があります。 rmarkdown環境で最初にkableExtraをロードすると、 上記のLaTeXパッケージ情報をrmarkdownメタデータに入れようとしますusepackage_latex()function このパッケージに付属しています。すべての「ニット+レンダリング」プロセスは分離されているはずなので、ニットボタンを押すだけで問題なく動作します。ただし、驚くべきことに(それを起動してくれてありがとう)、ここに表示されているように、コンソールからレンダリングしようとしている場合、(私の仮定)knitrまたはrmarkdownがキャッシュされた結果を再利用しようとしているため、このプロセスは複製できませんでした。これらのLaTeXパッケージの依存関係は、生成されているtexファイルに入れられておらず、エラーが発生することがわかりました。もちろん、RStudioを閉じて再起動すると、一時的なメモリがなくなり、それらのパッケージを再度ロードできるようになります。 rmarkdownのグローバル変数関連のバグの可能性があると思います。 render関数の最後に「メタを忘れる」部分を追加することで修正できると思いますが、それを確認する必要があります。

その一部は、過去のリリースで使用されていたLaTeXパッケージに関する十分なドキュメントを提供しなかったのは私の悪いことでした。さて、今週初めにリリースされたkableExtra 0.5.0の パッケージビネット の冒頭に、この問題に関する新しいセクションを追加しました。お気軽にチェックしてみてください。また、前に述べたように、現在の開発バージョンでは、関数kableExtra_latex_packages()を使用してリストを表示できます。

23
Hao

私の場合、@ Haoの回答は機能しませんでした...次のように、レンダリングを実行するたびに、最終的にkableExtraパッケージのアンロードを管理しました。

rmarkdown::render('torender.Rmd')
detach("package:kableExtra", unload=TRUE)

次のようなものを使用して環境を選択することも可能であるはずです

rmarkdown::render('torender.Rmd',envir=new.env(some parameters))

これはよりきれいです....しかし、私はこのように管理しませんでした!

5
Patricia

同様の問題がありました:テーブルを含むレポートをレンダリングするループPDF。PDFはbooktabs = Tではレンダリングされません。私の解決策は手動でロードすることでした。ループから呼び出されていたRmdスクリプトのセットアップチャンク内のすべてのラテックスパッケージ。

したがって、何度も呼び出されていたRmdスクリプトには、次のようなものがあります。

usepackage_latex("booktabs")
usepackage_latex("longtable")
usepackage_latex("array")
usepackage_latex("multirow")
usepackage_latex("xcolor", "table")
usepackage_latex("wrapfig")
usepackage_latex("float")
usepackage_latex("colortbl")
usepackage_latex("pdflscape")
usepackage_latex("tabu")
usepackage_latex("threeparttable")
usepackage_latex("threeparttablex")
usepackage_latex("ulem", "normalem")
usepackage_latex("makecell")

これにより、問題が修正されました。PDFはフォーマットされたテーブルでレンダリングされます。

うまくいけば、これは誰かを助けます。

3
Curtis

複数の.Rmdファイルに対してこれを行う簡単な方法は、これらのkableExtraが追加された\ usepackage {}コマンドのリストを使用して「headers.tex」ファイルを作成することでした。次に、.RmdファイルのYAMLヘッダーで:

output: 
  pdf_document:
    includes:
      in_header: headers.tex

これがheader.texファイルに入れたものです-動作したものからコピーしました。これは、「header-includes:」行とダッシュを取り除いたkableExtra_latex_packages()の出力でもあります。

\usepackage{booktabs}
\usepackage{longtable}
\usepackage{array}
\usepackage{multirow}
\usepackage{wrapfig}
\usepackage{float}
\usepackage{colortbl}
\usepackage{pdflscape}
\usepackage{tabu}
\usepackage{threeparttable}
\usepackage{threeparttablex}
\usepackage[normalem]{ulem}
\usepackage{makecell}
\usepackage{xcolor}
0
dnidz