Использование knitr для создания сложных динамических документов

Минимальный воспроизводимый пример (RE) ниже - моя попытка выяснить, как я могу использовать knitr для генерации сложных динамических документов, где "сложный" здесь относится не к элементам документа и их разметке, а к нелинейной логике базовых фрагментов кода R. Хотя предоставленное RE и его результаты показывают, что решение, основанное на таком подходе, может работать хорошо, я хотел бы знать: 1) является ли это правильным подходом использования 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)

Отчет EDA R Документ уценки (файл "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)
```

Результат можно найти здесь:

http://rpubs.com/abrpubs/eda1

1 ответ

Я не понимаю, что нелинейного в этом коде; возможно, потому что пример (спасибо за это кстати) достаточно мал, чтобы продемонстрировать код, но не достаточно велик, чтобы продемонстрировать беспокойство.

В частности, я не понимаю причину performEDA функция. Почему бы не поместить эту функциональность в уценку? Казалось бы, проще и понятнее читать. (Это не проверено...)

Let's look at summary descriptive statistics for our dataset

```{r DescriptiveDataset, include=TRUE}
print(describe(diamonds))
```

Now, let's examine each variable of interest individually.

Varible Price is ... Decriptive statistics for 'Price':

```{r DescriptivePrice, include=TRUE}
print(summary(data[["Price"]]))
```

Finally, let's examine price distribution across the dataset visually:

```{r VisualPrice, include=TRUE, fig.align='center'}
print(generatePlot(data, "Price"))
```

Похоже, вы собираетесь показать графики для всех переменных; Вы, возможно, ищете там петлю?

Кроме того, это не изменит функциональность, но было бы гораздо больше в рамках R идиома, чтобы иметь performEDA вернуть список с созданными им вещами, а не назначать их в глобальную среду. Мне потребовалось некоторое время, чтобы выяснить, что делает код, поскольку эти новые переменные, кажется, нигде не определены.

Другие вопросы по тегам