我在.Rmd
文档中使用了以下sql
代码。但是,我想在 .Rnw
文档中使用相同的 SQL 代码。
```{r label = setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, max.print = NA)
```
```{r, echo=FALSE, results='hide'}
library(DBI)
db <- dbConnect(RSQLite::SQLite(), dbname = "survey.db")
dbListTables(db)
```
```{sql, label = Q1, connection=db, tab.cap = "Table Caption"}
SELECT *
FROM Person;
```
希望获得代码格式化和输出打印功能。
最佳答案
将 RMarkdown 移植到 RNW 需要一些调整:
- 当然, block 分隔符需要调整:RNW 相当于
```{r, echo=FALSE}
是<<echo=FALSE>>=
和 RNW block 以@
结尾。 (请参阅minimal RNW example。) - 重要的是,虽然 RMarkdown 文档中的 block 总是指定一个引擎,但 RNW 中的引擎隐式是 R,除非选项
engine
已设置。所以```{r}
变得简单<<>>=
,但相当于```{sql}
是<<engine="sql">>=
. - RMarkdown 在嵌入 SQL block 时包含一些非常有用的魔法,请参阅 knitr Language Engines: SQL on rmarkdown.rstudio.com 。默认情况下,结果呈现为漂亮的表格,并且仅打印前 10 个结果。在 RNW,我们需要自己解决这个问题。
要在 RMarkdown 中嵌入 SQL,请注意 SQL 连接必须通过 connection
传递到 SQL block 。选项。选项output.var
可用于指定查询结果将分配到的对象的名称。
一个简单的解决方案(参见 previous revision )只需将 SQL 结果分配给一个对象,例如 res
,使用output.var
并添加另一个 R block ,打印 res
很好,例如使用xtable
。然而,有一种更优雅的方法,使用 hooks :
该示例使用 SQLite sample database来自sqlitetutorial.net 。在运行代码之前将其解压缩到您的工作目录。
\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}
一个新的 block 钩子(Hook) formatSQL
被添加。 (每当相应的 block 选项不是 NULL
时, block 钩子(Hook)就会运行。)在带有 engine="sql"
的 block 之后,它将 SQL 结果读入 sqlData
。然后,它使用 xtable
打印第一个 max.print
结果的行。
默认情况下, block 钩子(Hook) formatSQL
被激活(即全局设置为 TRUE
)并且 SQL 结果存储在 formatSQL_result
中。 block 选项max.print
控制要打印的行数(将其设置为 Inf
以打印所有行,始终)。
该表由 xtable
生成是高度可定制的。 block 选项xtable.args
被传递到xtable
和print.xtable.args
被传递到print.xtable
。在示例中,这些选项用于设置标题、标签并禁止 xtable 的默认注释。
在生成的 PDF 下方。请注意,RNW requires 中非 R 代码的语法高亮显示安装highlight并将目录添加到路径 (Windows)。
关于Rnw文档中的SQL代码与knitr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39256225/