130

以前、R Markdown を HTML に変換するコマンドについて質問したことがあります。

R MarkdownファイルをPDFドキュメントに変換する良い方法は何ですか?

適切な解決策は、コンテンツ (画像、方程式、html テーブルなど) を可能な限り保持することです。ソリューションは、コマンドラインから実行できる必要があります。良い解決策はクロスプラットフォームでもあり、理想的には依存関係を最小限に抑えて、メイクファイルなどを簡単に共有できるようにすることです。

具体的には、多くのオプションがあります。

  • RMD を MD から HTML から PDF に変換するかどうか。または RMD から MD から PDF。または RMD から PDF
  • markdownR でパッケージを使用する場合、どのオプションを指定するか
  • pandoc、R に組み込まれたパッケージ、またはその他のものを使用するかどうか

これは、提案されたソリューションの合理的なテストを提供すると思われるrmd ファイルの例です。これは、このブログ投稿の基礎として使用されました。

4

8 に答える 8

71

回答を更新(2013年2月10日)

rmarkdownパッケージ:Pandocとインターフェイスするrmarkdownパッケージがgithubで利用できるようになりました。機能が含まれていrenderます。ドキュメントは、他のさまざまな形式の中でrmarkdownをpdfに変換する方法をかなり明確にしています。これには、rmarkdownファイルに出力形式を含めることや、rend関数に出力形式を提供することを実行することが含まれます。例えば、

render("input.Rmd", "pdf_document")

コマンドライン:コマンドラインから 実行するとrender(たとえば、makefileを使用して)、pandocが見つからないという問題が発生することがあります。おそらく、それは検索パス上にありません。次の回答は、R環境にpandocを追加する方法を説明しています。

したがって、たとえば、RStudioを介してpandocのコピーを持っているOSXを実行しているコンピューターでは、次を使用できます。

Rscript -e "Sys.setenv(RSTUDIO_PANDOC='/Applications/RStudio.app/Contents/MacOS/pandoc');library(rmarkdown);  library(utils); render('input.Rmd', 'pdf_document')"

古い答え(2012年頃)

そのため、多くの人がPandocが進むべき道であると示唆しています。Pandocの最新バージョンを使用することの重要性については、以下の注を参照してください。

Pandocの使用

次のコマンドを使用して、R MarkdownをHTML(つまり、このmakefileのバリアント)に変換しました。ここRMDFILEで、はコンポーネントを含まないR Markdownファイルの名前です(拡張子はであり、ではないと.rmd想定しています)。.rmd.Rmd

RMDFILE=example-r-markdown  
Rscript -e "require(knitr); require(markdown); knit('$RMDFILE.rmd', '$RMDFILE.md'); markdownToHTML('$RMDFILE.md', '$RMDFILE.html', options=c('use_xhml'))"

次に、このコマンドをPDFに変換します

Pandoc -s example-r-markdown.html -o example-r-markdown.pdf


これに関するいくつかの注意:

  • プロットをimgurにエクスポートしてホストイメージにエクスポートするサンプルファイルの参照を削除しました。
  • imgurでホストされている画像への参照を削除しました。数字はローカルである必要があるようです。
  • 関数のオプションは、markdownToHTML画像参照がファイルへの参照であり、HTMLファイルに保存されているデータへの参照ではないことを意味しました(つまり、'base64_images'オプションリストから削除しました)。
  • 結果の出力は次のようになりました。ブラウザからHTMLファイルをpdfに印刷した場合に得られるものとは対照的に、明らかに非常にLaTeXスタイルのドキュメントを作成しました。

Pandocの最新バージョンを入手する

@daroczigで述べたように、PDFを出力するには、最新バージョンのPandocを用意することが重要です。2012年6月15日現在のUbuntuでは、パッケージマネージャーでバージョン1.8.1のPandocを使用していましたが、変更ログから、 PDFサポートには少なくともバージョン1.9以降のPandocが必要であるようです。

したがって、私はをインストールしcaball-installました。そして実行しました:

cabal update
cabal install pandoc

Pandocはにインストールされていた~/.cabal/bin/pandoc ので、実行pandocしても古いバージョンが表示されていました。パスへの追加については、こちらをご覧ください。

于 2012-06-15T02:36:59.897 に答える
23

pandocが本当に必要だと思います。これは、このタスク専用に設計および構築された優れたソフトウェアです:) pdfの他に、 mdファイルをdocxodtなどに変換できます。

Linux ではPandoc の最新バージョンをインストールするのは大変かもしれませんが (ソースからビルドするには ˙ 全体が必要になるhaskell-platformため)、Windows/Mac ではほんの数メガバイトのダウンロードで簡単にインストールできます。

brewed/knitted マークダウン ファイルがある場合は、pandocbash などで呼び出したり、systemR 内の関数を使用したりできます。後者の POC デモはṖandoc.convert、私の小さなパッケージの関数に実装されています(これは、私がしようとしているときにひどく退屈しているに違いありません)。あらゆる機会にそこに注意を向けてください)。

于 2012-06-14T19:55:15.150 に答える
10

ブラウザから印刷したときに表示されるものに似たオプションについては、wkhtmltopdf1 つのオプションを提供します。

Ubuntu の場合

sudo apt-get install wkhtmltopdf

次に、pandoc の例と同じコマンドで HTML にアクセスします。

RMDFILE=example-r-markdown  
Rscript -e "require(knitr); require(markdown); knit('$RMDFILE.rmd', '$RMDFILE.md'); markdownToHTML('$RMDFILE.md', '$RMDFILE.html', options=c('use_xhml'))"

その後

wkhtmltopdf example-r-markdown.html example-r-markdown.pdf

結果のファイルは次のようになります。MathJax を処理していないようで (この問題については、こちらで説明しています)、改ページが見苦しいです。ただし、場合によっては、LaTeX スタイルのプレゼンテーションよりも、このようなスタイルが好まれることがあります。

于 2012-06-15T02:54:52.087 に答える
9

2 つのステップのみ:

  1. ここから最新リリースの「pandoc」をインストールします。

    https://github.com/jgm/pandoc/releases

  2. pandocで関数を呼び出しますlibrary(knitr)

    library(knitr)
    pandoc('input.md', format = 'latex')
    

したがって、「input.md」を「input.pdf」に変換できます。

于 2014-06-21T22:16:56.233 に答える
3

R studio を使用するのが最も簡単な方法であることがわかりましたが、コマンド ラインから制御したい場合は、単純な R スクリプトでrmarkdown render コマンドを使用してトリックを実行できます (上記のとおり)。スクリプトの詳細はこちら

#!/usr/bin/env R

# Render R markdown to PDF.
# Invoke with:
# > R -q -f make.R --args my_report.Rmd

# load packages
require(rmarkdown)

# require a parameter naming file to render
if (length(args) == 0) {
    stop("Error: missing file operand", call. = TRUE)
} else {
    # read report to render from command line
    for (rmd in commandArgs(trailingOnly = TRUE)) {
        # render Rmd to PDF
        if ( grepl("\\.Rmd$", rmd) && file.exists(rmd)) {
            render(rmd, pdf_document())
        } else {
            print(paste("Ignoring: ", rmd))
        }
    }
}
于 2016-08-12T05:22:06.533 に答える