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:
p
, puis appeler p
après la boucle PLOTS <- NULL
, Et ajout des tracés dans la boucle PLOTS <- append(PLOTS, p)
.png
Mais je préfère ne pas avoir à gérer les frais d'enregistrement et de ré-accès à chaque fichierJ'ai peur que les subtilités des dispositifs de l'intrigue m'échappent.
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.
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).
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
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)
}
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')`
```