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 appeler p 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 boucle PLOTS <- 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.

36
demandé sur David Robinson 2012-08-14 20:14:53

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

33
répondu cbeleites 2012-08-15 14:10:11

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

7
répondu Hugo Koopmans 2013-06-14 09:52:19

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')`
```
3
répondu Alex 2016-12-12 04:30:38

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)
}
3
répondu Yang Liu 2018-07-18 21:20:31