SQL Rnw 文档中的代码与 knitr
SQL code in Rnw document with knitr
我在 .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 需要一些调整:
- 当然,块分隔符需要调整:
```{r, echo=FALSE}
的 RNW 等价物是 <<echo=FALSE>>=
,RNW 块以 @
结尾。 (参见minimal RNW example。)
- 重要的是,虽然 RMarkdown 文档中的块总是指定一个引擎,但 RNW 中的引擎隐式为 R,除非设置了选项
engine
。所以 ```{r}
变成简单的 <<>>=
,但是 ```{sql}
等价于 <<engine="sql">>=
.
- RMarkdown 在嵌入 SQL 块时包含一些非常有用的魔法,请参阅 knitr Language Engines: SQL on rmarkdown.rstudio.com。默认情况下,结果呈现为漂亮的 table 并且仅打印前 10 个结果。在 RNW,我们需要自己解决这个问题。
为了在 RMarkdown 中嵌入 SQL,请注意 SQL 连接必须通过 connection
选项传递给 SQL 块。选项 output.var
可用于指定查询结果将分配给的 object 的名称。
一个简单的解决方案(参见 previous revision) would just assign the SQL result to an object, say res
, using output.var
and add another R chunk that prints res
nicely, e.g. using xtable
. However, there is a more elegant approach using hooks:
示例使用了SQLite sample database from 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}
添加了一个新的块挂钩 formatSQL
。 (每当相应的块选项不是 NULL
时,块挂钩 运行。)在带有 engine="sql"
的块之后,它将 SQL 结果读入 sqlData
。然后,它使用 xtable
打印结果的前 max.print
行。
默认情况下,块挂钩 formatSQL
已激活(即全局设置为 TRUE
)并且 SQL 结果存储在 formatSQL_result
中。块选项 max.print
控制要打印的行数(设置为 Inf
打印 all 行,always).
xtable
制作的 table 是高度可定制的。块选项 xtable.args
传递给 xtable
,print.xtable.args
传递给 print.xtable
。在示例中,这些选项用于设置标题、标签和抑制 xtable 的默认注释。
在生成的 PDF 下方。请注意,RNW requires installing highlight 中 non-R 代码的语法突出显示并将目录添加到路径 (Windows).
我在 .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 需要一些调整:
- 当然,块分隔符需要调整:
```{r, echo=FALSE}
的 RNW 等价物是<<echo=FALSE>>=
,RNW 块以@
结尾。 (参见minimal RNW example。) - 重要的是,虽然 RMarkdown 文档中的块总是指定一个引擎,但 RNW 中的引擎隐式为 R,除非设置了选项
engine
。所以```{r}
变成简单的<<>>=
,但是```{sql}
等价于<<engine="sql">>=
. - RMarkdown 在嵌入 SQL 块时包含一些非常有用的魔法,请参阅 knitr Language Engines: SQL on rmarkdown.rstudio.com。默认情况下,结果呈现为漂亮的 table 并且仅打印前 10 个结果。在 RNW,我们需要自己解决这个问题。
为了在 RMarkdown 中嵌入 SQL,请注意 SQL 连接必须通过 connection
选项传递给 SQL 块。选项 output.var
可用于指定查询结果将分配给的 object 的名称。
一个简单的解决方案(参见 previous revision) would just assign the SQL result to an object, say res
, using output.var
and add another R chunk that prints res
nicely, e.g. using xtable
. However, there is a more elegant approach using hooks:
示例使用了SQLite sample database from 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}
添加了一个新的块挂钩 formatSQL
。 (每当相应的块选项不是 NULL
时,块挂钩 运行。)在带有 engine="sql"
的块之后,它将 SQL 结果读入 sqlData
。然后,它使用 xtable
打印结果的前 max.print
行。
默认情况下,块挂钩 formatSQL
已激活(即全局设置为 TRUE
)并且 SQL 结果存储在 formatSQL_result
中。块选项 max.print
控制要打印的行数(设置为 Inf
打印 all 行,always).
xtable
制作的 table 是高度可定制的。块选项 xtable.args
传递给 xtable
,print.xtable.args
传递给 print.xtable
。在示例中,这些选项用于设置标题、标签和抑制 xtable 的默认注释。
在生成的 PDF 下方。请注意,RNW requires installing highlight 中 non-R 代码的语法突出显示并将目录添加到路径 (Windows).