MYa*_*208 5 sql r knitr r-markdown rnw
我sql在.Rmd文档中使用了以下代码。但是,我想在.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;
```
Run Code Online (Sandbox Code Playgroud)
更愿意获得代码格式和输出打印功能。
将 RMarkdown 移植到 RNW 需要一些调整:
```{r, echo=FALSE}is<<echo=FALSE>>=并且 RNW 块以 结尾@。(参见最小 RNW 示例。)engine设置了该选项。因此```{r}变得很简单<<>>=,但相当于```{sql}是<<engine="sql">>=。要在 RMarkdown 中嵌入 SQL,请注意,必须通过选项将 SQL 连接传递到 SQL 块connection。该选项output.var可用于指定查询结果将分配到的对象的名称。
一个简单的解决方案(参见之前的修订版)只需将 SQL 结果分配给一个对象,例如res使用output.var,并添加另一个打印效果res良好的 R 块,例如使用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}
Run Code Online (Sandbox Code Playgroud)
formatSQL添加了一个新的块钩子。(每当相应的块选项不是时,块钩子就会运行NULL。)在带有 的块之后engine="sql",它将 SQL 结果读入sqlData。然后,它用于打印结果的xtable第一行。max.print
默认情况下,块钩子formatSQL被激活(即全局设置为TRUE)并且 SQL 结果存储在 中formatSQL_result。chunk 选项max.print控制要打印的行数(将其设置为Inf打印所有行,always)。
生成的表格xtable是高度可定制的。chunk 选项xtable.args被传递到xtable并被print.xtable.args传递到print.xtable. 在示例中,这些选项用于设置标题、标签并禁止 xtable 的默认注释。
下面是生成的 PDF。请注意,RNW 中非 R 代码的语法突出显示需要安装突出显示并将目录添加到路径 (Windows)。
| 归档时间: |
|
| 查看次数: |
1514 次 |
| 最近记录: |