2016-08-31 7 views
4

Я использовал следующий код sql в документе .Rmd. Тем не менее, я хочу использовать тот же код sql в документе .Rnw. Был бы очень признателен, если кто-нибудь поможет мне, как это сделать. Любая помощь будет высоко оценена. СпасибоКод SQL в документе Rnw с knitr

```{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; 
``` 

Предпочитаете получить форматирование форматирования и вывода текста.

+0

Не уверен, что если вы видели это уже (и не, если это поможет): http://yihui.name/knitr/demo/engines/ – Frank

+1

Спасибо @Frank для ссылки. Я уже это видел, но это не полезно. – MYaseen208

+1

Не уверен, что я понимаю вопрос - вы просто ищете что-то вроде [этого] (https://gist.github.com/ClaudiusL/b27b682db8ed2261dc5c2b04b326f78a)? –

ответ

3

Портирование 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).

Output

+0

Great @CL. работает как шарм. Был бы признателен, если бы вы указали, как помещать подпись в верхнюю часть таблицы. Большое спасибо за вашу помощь. – MYaseen208

+1

@ MYaseen208 Просто передайте 'caption.placement =" top "' to 'print.xtable'. –

+0

Спасибо @CL. для вашей помощи. Есть еще две вещи, которые нужно изменить, команда 'knitr2pdf' из' knitr' показывает вывод 'xtable' на консоли, который не требуется. Также хотелось бы знать, как использовать 'caption.placement =" top "и' connection = db' глобально, а не локально. Есть предположения. – MYaseen208

 Смежные вопросы

  • Нет связанных вопросов^_^