如何使用 Emacs、ESS、pandoc-mode 和 polymode 从 Rmd 文件创建 pdf?
How to create a pdf from a Rmd file using Emacs, ESS, pandoc-mode and polymode?
这是对 "classic" Rmd 文件的改编,我想使用 Emacs 编织成 pdf(Emacs 说话统计) 和多模态。我找不到正确的命令来执行此操作。关于多模的文档很少。我正在使用 Emacs 社会科学入门工具包。
---
title: "Untitled"
author: "SB"
date: "Wednesday, February 04, 2015"
output: pdf_document
---
You can embed an R code chunk like this:
```{r}
summary(cars)
```
You can also embed plots, for example:
```{r, echo=FALSE}
plot(cars)
```
作为 doc says 使用 M-n w 和 M-n W 到 set/change 织工。对于 ESS,您可能应该使用 knitr-ESS
weaver,因为它使用当前的 *R*
进程。
您可以使用 rmarkdown package 中的 rmarkdown::render()
将 .Rmd
文件编入 markdown 并呈现输出文件(PDF、Word、HTML 等)只需一个命令!
我不确定 ESS 中是否已经包含对 rmarkdown
工作流的支持(我正在尝试涉足 elisp)所以我编写了一个调用 rmarkdown::render()
的函数并允许使用前缀 arg 自定义 rmarkdown::render()
函数调用的输入(例如,C-u
)。
;; spa/rmd-render
;; Global history list allows Emacs to "remember" the last
;; render commands and propose as suggestions in the minibuffer.
(defvar rmd-render-history nil "History list for spa/rmd-render.")
(defun spa/rmd-render (arg)
"Render the current Rmd file to PDF output.
With a prefix arg, edit the R command in the minibuffer"
(interactive "P")
;; Build the default R render command
(setq rcmd (concat "rmarkdown::render('" buffer-file-name "',"
"output_dir = '../reports',"
"output_format = 'pdf_document')"))
;; Check for prefix argument
(if arg
(progn
;; Use last command as the default (if non-nil)
(setq prev-history (car rmd-render-history))
(if prev-history
(setq rcmd prev-history)
nil)
;; Allow the user to modify rcmd
(setq rcmd
(read-from-minibuffer "Run: " rcmd nil nil 'rmd-render-history))
)
;; With no prefix arg, add default rcmd to history
(setq rmd-render-history (add-to-history 'rmd-render-history rcmd)))
;; Build and evaluate the shell command
(setq command (concat "echo \"" rcmd "\" | R --vanilla"))
(compile command))
(define-key polymode-mode-map (kbd "C-c r") 'spa/rmd-render)
请注意,我有一些特定的参数设置,例如 output_dir = '../reports'
,但可以轻松自定义 elisp 以满足您的需要。
在您的初始化文件中,您只需在 .Rmd
文件中输入 C-c r
(或 C-u C-c r
以呈现不同的格式、位置等) .该命令将打开一个新的 window,其中包含一个名为 *compilation*
的缓冲区,其中会出现任何错误。
这绝对可以改进,我很想听听建议。
这是对 "classic" Rmd 文件的改编,我想使用 Emacs 编织成 pdf(Emacs 说话统计) 和多模态。我找不到正确的命令来执行此操作。关于多模的文档很少。我正在使用 Emacs 社会科学入门工具包。
---
title: "Untitled"
author: "SB"
date: "Wednesday, February 04, 2015"
output: pdf_document
---
You can embed an R code chunk like this:
```{r}
summary(cars)
```
You can also embed plots, for example:
```{r, echo=FALSE}
plot(cars)
```
作为 doc says 使用 M-n w 和 M-n W 到 set/change 织工。对于 ESS,您可能应该使用 knitr-ESS
weaver,因为它使用当前的 *R*
进程。
您可以使用 rmarkdown package 中的 rmarkdown::render()
将 .Rmd
文件编入 markdown 并呈现输出文件(PDF、Word、HTML 等)只需一个命令!
我不确定 ESS 中是否已经包含对 rmarkdown
工作流的支持(我正在尝试涉足 elisp)所以我编写了一个调用 rmarkdown::render()
的函数并允许使用前缀 arg 自定义 rmarkdown::render()
函数调用的输入(例如,C-u
)。
;; spa/rmd-render
;; Global history list allows Emacs to "remember" the last
;; render commands and propose as suggestions in the minibuffer.
(defvar rmd-render-history nil "History list for spa/rmd-render.")
(defun spa/rmd-render (arg)
"Render the current Rmd file to PDF output.
With a prefix arg, edit the R command in the minibuffer"
(interactive "P")
;; Build the default R render command
(setq rcmd (concat "rmarkdown::render('" buffer-file-name "',"
"output_dir = '../reports',"
"output_format = 'pdf_document')"))
;; Check for prefix argument
(if arg
(progn
;; Use last command as the default (if non-nil)
(setq prev-history (car rmd-render-history))
(if prev-history
(setq rcmd prev-history)
nil)
;; Allow the user to modify rcmd
(setq rcmd
(read-from-minibuffer "Run: " rcmd nil nil 'rmd-render-history))
)
;; With no prefix arg, add default rcmd to history
(setq rmd-render-history (add-to-history 'rmd-render-history rcmd)))
;; Build and evaluate the shell command
(setq command (concat "echo \"" rcmd "\" | R --vanilla"))
(compile command))
(define-key polymode-mode-map (kbd "C-c r") 'spa/rmd-render)
请注意,我有一些特定的参数设置,例如 output_dir = '../reports'
,但可以轻松自定义 elisp 以满足您的需要。
在您的初始化文件中,您只需在 .Rmd
文件中输入 C-c r
(或 C-u C-c r
以呈现不同的格式、位置等) .该命令将打开一个新的 window,其中包含一个名为 *compilation*
的缓冲区,其中会出现任何错误。
这绝对可以改进,我很想听听建议。