Подтвердить что ты не робот

R knitr Markdown: выходные графики в пределах цикла

Я хотел бы создать автоматизированный отчет о пользователе, который будет генерировать гистограммы для каждого числового поля в моем кадре данных. Моя цель - сделать это, не указывая фактические поля (этот набор данных содержит более 70, и я также хотел бы повторно использовать script).

Я пробовал несколько разных подходов:

  • сохранение графика для объекта, p, а затем вызов p после цикла
    • Это только отображает окончательный график
  • Создание массива графиков PLOTS <- NULL и добавление графиков в цикле PLOTS <- append(PLOTS, p)
    • Доступ к этим записям из цикла не работает вообще
  • Даже попробовал сохранить каждый файл .png, но скорее бы не имел дело с накладными расходами на сохранение и последующим повторным доступом к каждому файлу.

Я боюсь, что запутывание сюжетных устройств ускользает от меня.

Вопрос

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

R markdown chunk с помощью knitr в RStudio:

```{r plotNumeric, echo=TRUE, fig.height=3}
suppressPackageStartupMessages(library(ggplot2))
FIELDS <- names(df)[sapply(df, class)=="numeric"]
for (field in  FIELDS){
  qplot(df[,field], main=field)  
}
```

С этой точки зрения, я надеюсь настроить дальнейшие планы.

4b9b3361

Ответ 1

Оберните qplot в print.

knitr сделает это для вас, если qplot находится за пределами цикла, но (по крайней мере, версия, которую я установил) не обнаруживает это внутри цикла (что согласуется с поведением команды R линия).

Ответ 2

Я использую дочерние Rmd файлы в markdown, также работает в sweave.

в Rmd используйте следующий фрагмент:

```{r run-numeric-md, include=FALSE}
out = NULL
for (i in c(1:num_vars)) {
  out = c(out, knit_child('da-numeric.Rmd'))
}
```

da-numeric.Rmd выглядит так:

Variabele `r num_var_names[i]`
------------------------------------

Missing :  `r sum(is.na(data[[num_var_names[i]]]))`  
Minimum value : `r min(na.omit(data[[num_var_names[i]]]))`  
Percentile 1 : `r quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[2]`  
Percentile 99 : `r quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[100]`  
Maximum value : `r max(na.omit(data[[num_var_names[i]]]))`  

```{r results='asis', comment="" }
warn_extreme_values=3
d1 = quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[2] > warn_extreme_values*quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[1]
d99 = quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[101] > warn_extreme_values*quantile(na.omit(data[[num_var_names[i]]]),probs = seq(0, 1, 0.01))[100]
if(d1){cat('Warning : Suspect extreme values in left tail')}
if(d99){cat('Warning : Suspect extreme values in right tail')}
```

``` {r eval=TRUE,  fig.width=6, fig.height=2}
library(ggplot2)

v <- num_var_names[i]
hp <- ggplot(na.omit(data), aes_string(x=v)) + geom_histogram( colour="grey", fill="grey", binwidth=diff(range(na.omit(data[[v]]))/100))

hp + theme(axis.title.x = element_blank(),axis.text.x = element_text(size=10)) + theme(axis.title.y = element_blank(),axis.text.y = element_text(size=10))

```

см. мой пакет datamineR на github https://github.com/hugokoopmans/dataMineR

Ответ 3

В качестве дополнения к Hugo отличный ответ, я считаю, что в 2016 году вам нужно включить команду print:

```{r run-numeric-md, include=FALSE}
out = NULL
for (i in c(1:num_vars)) {
  out = c(out, knit_child('da-numeric.Rmd'))
}

`r paste(out, collapse = '\n')`
```