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 but est de le faire sans avoir à spécifier les champs réels (cet ensemble de données contient plus de 70 et je voudrais également réutiliser le script).
J'ai essayé quelques approches différentes:
- enregistrer le tracé dans un objet,
p
, puis appelerp
après la boucle- cela trace uniquement le tracé final
- création d'un tableau de tracés,
PLOTS <- NULL
, et ajout des tracés dans la bouclePLOTS <- append(PLOTS, p)
- L'accès à ces tracés hors de la boucle n'a pas fonctionné du tout
- a même essayé d'enregistrer chacun dans un fichier
.png
mais préférerait ne pas avoir à gérer les frais généraux d'enregistrement puis de ré-accéder à chaque fichier
J'ai peur que les subtilités des dispositifs de complot m'échappent.
Question
Comment puis-je générer le bloc suivant chaque tracé dans la boucle du rapport? Actuellement, le meilleur que je puisse obtenir est la sortie de l'intrigue finale produite en l'enregistrant dans un objet et en appelant cet objet en dehors de la boucle.
R bloc markdown en 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 point, j'espère personnaliser les parcelles plus loin.
4 réponses
Envelopper le qplot
dans print
.
knitr
fera cela 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 enfants dans markdown, 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-numérique.Mdm 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 paquet datamineR sur github https://github.com/hugokoopmans/dataMineR
Comme un complément à Hugo excellente réponse, je crois qu'en 2016, vous devez inclure un print
commande ainsi:
```{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')`
```
Souhaitez ajouter une note rapide:
D'une certaine manière, j'ai googlé la même question et entrer dans cette page.
Maintenant, en 2018, utilisez simplement print()
dans la boucle.
for (i in 1:n){
...
f <- ggplot(.......)
print(f)
}