web-dev-qa-db-fra.com

R knitr Markdown: Tracés de sortie dans la boucle For

Je voudrais créer un rapport knitr automatisé qui produira des histogrammes pour chaque champ numérique dans mon dataframe. Mon objectif est de le faire sans avoir à spécifier les champs réels (ce jeu de données contient plus de 70 et je voudrais également réutiliser le script).

J'ai essayé différentes approches:

  • enregistrer le tracé dans un objet, p, puis appeler p après la boucle
    • Cela ne fait que tracer le tracé final
  • Création d'un tableau de tracés, PLOTS <- NULL, Et ajout des tracés dans la boucle PLOTS <- append(PLOTS, p)
    • L'accès à ces parcelles hors de la boucle n'a pas fonctionné du tout
  • J'ai même essayé d'enregistrer chacun dans un fichier .png Mais je préfère ne pas avoir à gérer les frais d'enregistrement et de ré-accès à chaque fichier

J'ai peur que les subtilités des dispositifs de l'intrigue m'échappent.

Question

Comment puis-je créer le bloc suivant pour chaque tracé de la boucle dans le rapport? Actuellement, le mieux que je puisse réaliser est la sortie du tracé final produit en l'enregistrant dans un objet et en appelant cet objet en dehors de la boucle.

Morceau de démarquage R utilisant knitr dans 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)  
}
```

À partir de ce moment, j'espère personnaliser davantage les tracés.

52
bnjmn

Enveloppez le qplot dans print.

knitr le fera pour vous si le qplot est en dehors d'une boucle, mais (au moins la version que j'ai installée) ne le détecte pas dans la boucle (ce qui est cohérent avec le comportement de la ligne de commande R).

43
cbeleites

J'utilise des fichiers Rmd enfant dans le démarquage, fonctionne également dans sweave.

dans Rmd, utilisez l'extrait suivant:

```{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 ressemble à:

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))

```

voir mon package datamineR sur github https://github.com/hugokoopmans/dataMineR

9
Hugo Koopmans

Je souhaite ajouter une note rapide: d'une manière ou d'une autre, j'ai cherché sur Google la même question et je suis entré dans cette page. Maintenant en 2018, il suffit d'utiliser print() dans la boucle.

for (i in 1:n){
...
    f <- ggplot(.......)
    print(f)
}
4
Yang Liu

En complément de l'excellente réponse d'Hugo, je pense qu'en 2016, vous devez également inclure une commande 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')`
```
3
Alex