将 RMarkdown 移植到 RNW 需要一些调整:
- 当然,块分隔符需要调整: RNW 等价于
```{r, echo=FALSE}
is<<echo=FALSE>>=
和 RNW 块以 . 结尾@
。(请参阅最小的 RNW 示例。)
- 重要的是,虽然 RMarkdown 文档中的块总是指定一个引擎,但 RNW 中的引擎是隐含的 R,除非
engine
设置了该选项。所以```{r}
变得简单<<>>=
,但相当于```{sql}
is <<engine="sql">>=
。
- RMarkdown 在嵌入 SQL 块时包含一些非常有用的魔法,请参阅knitr 语言引擎:rmarkdown.rstudio.com 上的 SQL。默认情况下,结果呈现为漂亮的表格,并且只打印前 10 个结果。在 RNW 中,我们需要自己处理这个问题。
对于在 RMarkdown 中嵌入 SQL,请注意 SQL 连接必须通过connection
选项传递给 SQL 块。该选项output.var
可用于指定将分配查询结果的对象的名称。
一个简单的解决方案(参见以前的版本)只需将 SQL 结果分配给一个对象,例如res
usingoutput.var
并添加另一个打印res
良好的 R 块,例如 using xtable
。但是,使用hooks有一种更优雅的方法:
该示例使用来自sqlitetutorial.net的SQLite 示例数据库。在运行代码之前将其解压缩到您的工作目录。
\documentclass{article}
\begin{document}
\thispagestyle{empty}
<<include=FALSE>>=
library(knitr)
library(DBI)
knit_hooks$set(formatSQL = function(before, options, envir) {
if (!before && opts_current$get("engine") == "sql") {
sqlData <- get(x = opts_current$get("output.var"))
max.print <- min(nrow(sqlData), opts_current$get("max.print"))
myxtable <- do.call(xtable::xtable, c(list(x = sqlData[1:max.print, ]), opts_current$get("xtable.args")))
capture.output(myoutput <-do.call(xtable::print.xtable, c(list(x = myxtable, file = "test.txt"), opts_current$get("print.xtable.args"))))
return(asis_output(paste(
"\\end{kframe}",
myoutput,
"\\begin{kframe}")))
}
})
opts_chunk$set(formatSQL = TRUE)
opts_chunk$set(output.var = "formatSQL_result")
opts_chunk$set(max.print = getOption("max.print"))
@
<<echo=FALSE, results="hide">>=
db <- dbConnect(RSQLite::SQLite(), dbname = "chinook.db")
@
<<engine = "sql", connection=db, max.print = 8, xtable.args=list(caption = "My favorite artists?", label="tab:artist"), print.xtable.args=list(comment=FALSE, caption.placement="top")>>=
SELECT * FROM artists;
@
\end{document}
添加了一个新的块挂钩formatSQL
。(当相应的块选项不是时,块挂钩就会运行NULL
。)在带有 的块之后engine="sql"
,它将 SQL 结果读入sqlData
. 然后,它用于xtable
打印结果的第一max.print
行。
默认情况下,块挂钩formatSQL
被激活(即它被全局设置为TRUE
)并且 SQL 结果存储在formatSQL_result
. chunk 选项max.print
控制要打印的行数(将其设置Inf
为打印所有行,总是)。
由生产的桌子xtable
是高度可定制的。chunk 选项xtable.args
被传递给xtable
并被print.xtable.args
传递给print.xtable
. 在示例中,这些选项用于设置标题、标签和禁止 xtable 的默认注释。
在生成的 PDF 下方。请注意,RNW 中非 R 代码的语法高亮需要安装highlight并将目录添加到路径 (Windows)。