Приведенный ниже минимальный воспроизводимый пример (RE) является моей попыткой выяснить, как я могу использовать knitr
для создания сложных динамических документов, где "сложный" здесь относится не к элементам документа. и их расположение, а с нелинейной логикой базовых фрагментов кода R. Хотя предоставленный RE и его результаты показывают, что решение, основанное на таком подходе, может работать хорошо, я хотел бы знать: 1) является ли это правильным< /em> подход к использованию knitr
для таких ситуаций; 2) есть ли какие-либо оптимизации, которые можно внести для улучшения подхода; 3) каковы альтернативные подходы, которые могут снизить детализацию фрагментов кода.
Исходный код EDA (файл "reEDA.R"):
## @knitr CleanEnv
rm(list = ls(all.names = TRUE))
## @knitr LoadPackages
library(psych)
library(ggplot2)
## @knitr PrepareData
set.seed(100) # for reproducibility
data(diamonds, package='ggplot2') # use built-in data
## @knitr PerformEDA
generatePlot <- function (df, colName) {
df <- df
df$var <- df[[colName]]
g <- ggplot(data.frame(df)) +
scale_fill_continuous("Density", low="#56B1F7", high="#132B43") +
scale_x_log10("Diamond Price [log10]") +
scale_y_continuous("Density") +
geom_histogram(aes(x = var, y = ..density..,
fill = ..density..),
binwidth = 0.01)
return (g)
}
performEDA <- function (data) {
d_var <- paste0("d_", deparse(substitute(data)))
assign(d_var, describe(data), envir = .GlobalEnv)
for (colName in names(data)) {
if (is.numeric(data[[colName]]) || is.factor(data[[colName]])) {
t_var <- paste0("t_", colName)
assign(t_var, summary(data[[colName]]), envir = .GlobalEnv)
g_var <- paste0("g_", colName)
assign(g_var, generatePlot(data, colName), envir = .GlobalEnv)
}
}
}
performEDA(diamonds)
Документ R Markdown отчета EDA (файл "reEDA.Rmd"):
```{r KnitrSetup, echo=FALSE, include=FALSE}
library(knitr)
opts_knit$set(progress = TRUE, verbose = TRUE)
opts_chunk$set(
echo = FALSE,
include = FALSE,
tidy = FALSE,
warning = FALSE,
comment=NA
)
```
```{r ReadChunksEDA, cache=FALSE}
read_chunk('reEDA.R')
```
```{r CleanEnv}
```
```{r LoadPackages}
```
```{r PrepareData}
```
Narrative: Data description
```{r PerformEDA}
```
Narrative: Intro to EDA results
Let's look at summary descriptive statistics for our dataset
```{r DescriptiveDataset, include=TRUE}
print(d_diamonds)
```
Now, let's examine each variable of interest individually.
Varible Price is ... Decriptive statistics for 'Price':
```{r DescriptivePrice, include=TRUE}
print(t_price)
```
Finally, let's examine price distribution across the dataset visually:
```{r VisualPrice, include=TRUE, fig.align='center'}
print(g_price)
```
Результат можно найти здесь:
brew
? У меня не было возможности попробовать это, но я слышал, что он может выполнять циклы и более программные конструкции при создании документа. - person Aaron left Stack Overflow   schedule 08.09.2014brew
, когда мне его рекомендовали для другой задачи. Я посмотрел очень кратко. Я смог решить эту проблему, используя менее сложный подход. Я считаю, чтоknitr
является достаточно гибким и мощным (и сложным), чтобы добавить дополнительный уровень сложности в мое решение, добавив механизм шаблонов, такой какbrew
. Его документация очень ограничена, плюс я считаю, что большую часть того, что может сделатьbrew
, можно сделать с помощью хуковknitr
. Кроме того, я не понимаю, как это решает проблему нелинейной логики в коде. - person Aleksandr Blekh   schedule 08.09.2014brew
, я только что нашел этот хороший пост в блоге с полным примером: learnr.wordpress.com/2009/09/09/. Теперь мне все ясно. Похоже, чтоbrew
стоит еще раз взглянуть (если только @Yihui не покажет, как делать то, что я хочу, используя только функциональностьknitr
). - person Aleksandr Blekh   schedule 08.09.2014