Портирование RMarkdown к RNW требует тонкой настройки:
- Конечно, разделители порций должны быть отрегулированы: RNW эквивалент
```{r, echo=FALSE}
является <<echo=FALSE>>=
и RNW ломти заканчиваются @
. (См. minimal RNW example.)
- Важно отметить, что в то время как куски в документах RMarkdown всегда указывают двигатель, двигатель в RNW неявно R, если не установлен параметр
engine
. Таким образом, ```{r}
становится просто <<>>=
, но эквивалент ```{sql}
- <<engine="sql">>=
.
- RMarkdown включает в себя некоторые очень полезные магии при встраивании блоков SQL, см. knitr Language Engines: SQL on rmarkdown.rstudio.com. По умолчанию результаты отображаются как хорошая таблица, и печатаются только первые 10 результатов. В RNW нам нужно позаботиться об этом самостоятельно.
Для внедрения SQL в RMarkdown обратите внимание, что SQL-соединение должно быть передано в блок SQL с помощью опции connection
. Опцию output.var
можно использовать для указания имени объекта, которому будет назначен результат запроса.
Простое решение (см previous revision) будет просто присвоить результат SQL к объекту, скажем res
, используя output.var
и добавить еще один кусок R, который печатает 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}
новый кусок крюк formatSQL
добавляется. (Chunk hooks запускаются всякий раз, когда соответствующий параметр chunk не равен NULL
.) После фрагмента с engine="sql"
он считывает результаты SQL в sqlData
. Затем он использует xtable
для печати первых max.print
строк результата.
По умолчанию кусок крюк formatSQL
активируется (т.е. он установлен в глобальном масштабе TRUE
) и результаты SQL хранятся в formatSQL_result
. Опция куска max.print
управляет количеством строк для печати (установите его на Inf
для печати все строк, всегда).
Стол, созданный xtable
, очень настраиваемый. Опция куска xtable.args
передается в xtable
, а print.xtable.args
передается в print.xtable
. В этом примере эти параметры используются для установки надписи, метки и для подавления комментария по умолчанию для xxtable.
Ниже сгенерированного PDF. Обратите внимание, что подсветка синтаксиса для кода, отличного от R, в RNW requires, установка highlight и добавление каталога в путь (Windows).
Не уверен, что если вы видели это уже (и не, если это поможет): http://yihui.name/knitr/demo/engines/ – Frank
Спасибо @Frank для ссылки. Я уже это видел, но это не полезно. – MYaseen208
Не уверен, что я понимаю вопрос - вы просто ищете что-то вроде [этого] (https://gist.github.com/ClaudiusL/b27b682db8ed2261dc5c2b04b326f78a)? –