Production automatique de fiches

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Hugo Pirson
Messages : 11
Enregistré le : 08 Juin 2022, 16:33

Production automatique de fiches

Messagepar Hugo Pirson » 09 Juin 2022, 13:11

Bonjour à tous,

J'essaie actuellement, à partir d'un dataframe, d'automatiser la création de fiches "types" en Word (donc par R Markdown). Je voudrais pouvoir créer une page word pour chacune des lignes (observations) de mon DF avec des éléments assez simples tels que :

"Année = [colonne A]
Contact = [colonne B]
etc...."

Un des problèmes que je rencontre est d'automatiser ce processus, pour que 1 dataframe = 1 fichier word (où les x observations se retrouvent en x pages du document).

En parcourant les différentes aides, j'ai compris que plusieurs solutions s'offraient à moi : les boucles for pour multiplier la même action sur chacune des observations, le package purrr et sa fonction map, le package officer.
Je suis un peu perdu face à tout ça, mais j'ai essayé quelques manipulations notamment avec les boucles for [for(i in nrow(DF))] mais je n'arrive pas à automatiser la sélection des variables de chacune des lignes du DF dans mon texte final.

Merci d'avance pour votre aide !
Hugo.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Production automatique de fiches

Messagepar Mickael Canouil » 10 Juin 2022, 08:08

Bonjour,

un exemple de code reproductible de ce que vous avez essayé, nous permettrait de vous aiguiller, en l'état, c'est difficile de proposer quoique ce soit.

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Hugo Pirson
Messages : 11
Enregistré le : 08 Juin 2022, 16:33

Re: Production automatique de fiches

Messagepar Hugo Pirson » 13 Juin 2022, 09:42

Bonjour,
Veuillez m'excuser, je ne suis pas encore bien habitué aux échanges sur forum.

Voici donc l'exemple type de ce que je voudrais réaliser sur R. Je crée un dataframe de trois variables, composé de 4 observations. A l'évidence mon cas réel est composé de plusieurs dizaines d'observations, c'est pourquoi j'aimerais automatiser ce traitement.

Code : Tout sélectionner

knitr::opts_chunk$set(echo = FALSE)
df = data.frame(nom = c("x1","x2","x3","x4"),
                theme = c("logement","economie","social","environnement"),
                annee = c("2015","2004","2015","2006"))
 


Fonctionnant sur R Markdown pour ce travail, je simule la création d'une fiche simple en mobilisant les 3 variables pour chaque observation (pour rappel 1 page word devrait correspondre à 1 observation dans mon DF).

Code : Tout sélectionner

# Présentation organisme `r df[1,1]`
Thème = `r df[1,2]`
Année de création = `r df[1,3]`

\newpage

# Présentation organisme `r df[2,1]`
Thème = `r df[2,2]`
Année de création = `r df[2,3]`


Voilà le rendu une fois le knit effectué :
https://imgur.com/a/xJc4XgC


Dans ce cas tout fonctionne, sauf que j'aimerais automatiser ce qui se trouvent entre les `` pour que la machine sélectionne une nouvelle ligne à chaque fois. Pensez-vous qu'une boucle for me permettrait de faire ça ? En termes de syntaxe, c'est là que mes compétences sont assez limitées pour intégrer une boucle for dans un code R Markdown.

Merci d'avance.
Hugo.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Production automatique de fiches

Messagepar Mickael Canouil » 13 Juin 2022, 18:30

Bonjour,

vous pouvez écrire un fichier type Rmarkdown comme suit par exemple avec params pour définir des paramètres (voir la documentation dans le livre ou l'extension Rmarkdown)

Code : Tout sélectionner

---
title"Untitled"
formatpdf_document
params
:
  
dataNULL
---

```
{r}
knitr::opts_chunk
$set(echo = FALSE)
```

```
{r}
#| results: asis
df <- params[["data"]]

for (irow in seq_len(nrow(df))) {
  cat(
    c(
      sprintf("# Présentation organisme %s\n", df[irow, 1]),
      sprintf("Thème = %s", df[irow, 2]),
      sprintf("Année de création = %s", df[irow, 3]),
      "\n\\newpage\n"
    ),
    sep = "\n"
  )
}
```
 


Ensuite dans un terminal R:

Code : Tout sélectionner

df <- data.frame(
  
nom c("x1""x2""x3""x4"),
  
theme c("logement""economie""social""environnement"),
  
annee c("2015""2004""2015""2006")
)
rmarkdown::render("mon_fichier.Rmd"params = list(data df)) 


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Hugo Pirson
Messages : 11
Enregistré le : 08 Juin 2022, 16:33

Re: Production automatique de fiches

Messagepar Hugo Pirson » 14 Juin 2022, 10:48

Bonjour et merci beaucoup Mickaël !

Ça marche parfaitement, de même que pour les DF sur lesquels je voulais réaliser ce traitement.

J'ai encore une petite difficulté en termes de mise en page sur mon MS word final.

Tout d'abord la police, que je voudrais modifier (taille et nom de police) :

Code : Tout sélectionner

---
title:
format: word_document
mainfont: Times New Roman
fontsize: 14pt
params:
  data: NULL
---

En regardant sur différents forums je n'arrive pas à appliquer de solution convenable.

Et mon autre demande porte sur les sauts de lignes que j'aimerais faire dans mon word final. J'ai essayé de décomposer les différentes parties (en différents cat) pour pouvoir insérer des "\n" entre chaque, mais cela ne fonctionne pas.

Code : Tout sélectionner

```{r,results = 'asis'}
df <- params[["data"]]

for (irow in seq_len(nrow(df))) {
  cat(sprintf("# %s\n",df[irow, 1]),
      sep = "\n")
  cat("\n  ")
  cat(
    c(
      sprintf("Thème = %s", df[irow, 2]),
      ),
    sep = "\n"
    )
  cat("\n  ")
  cat(
    c(
    sprintf("Année de création = %s", df[irow, 3]),
      "\n\\newpage\n"   
      ),
    sep = "\n"
  )
}
```

Comme vous le voyez j'ai tenté d'insérer un double espace après le \n, mais rien n'y fait.

Merci encore pour votre aide.
A bientôt,
Hugo.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Production automatique de fiches

Messagepar Mickael Canouil » 14 Juin 2022, 18:17

rmarkdown n'est pas optimisé pour Word.

Si vous voulez vraiment faire du Word, essayez {officedown} https://davidgohel.github.io/officedown/


Personnellement, je ne fais pas de Word, puisque il est presque impossible de rapatrier des modifications de celui-ci vers le document d'origine.
En général, le document Word n'a pas vocation à être édité, donc pourquoi laisser la possibilité quand on peut générer des document HTML ou PDF ?
Mickaël
mickael.canouil.fr | rlille.fr

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Production automatique de fiches

Messagepar Logez Maxime » 15 Juin 2022, 08:20

Bonjour,

juste un ajout sur la fonction sprintf, on peut recycler le même argument plusieurs fois :

Code : Tout sélectionner

sprintf("# Présentation organisme df[%1$d, 1]\nThème = df[%1$d, 2]\nAnnée de création = df[%1$d, 3]\n\\newpage\n", idrow)

Cordialement,
Maxime

Hugo Pirson
Messages : 11
Enregistré le : 08 Juin 2022, 16:33

Re: Production automatique de fiches

Messagepar Hugo Pirson » 16 Juin 2022, 07:59

Mickael Canouil a écrit :rmarkdown n'est pas optimisé pour Word.

Si vous voulez vraiment faire du Word, essayez {officedown} https://davidgohel.github.io/officedown/


Personnellement, je ne fais pas de Word, puisque il est presque impossible de rapatrier des modifications de celui-ci vers le document d'origine.
En général, le document Word n'a pas vocation à être édité, donc pourquoi laisser la possibilité quand on peut générer des document HTML ou PDF ?


Bonjour,
Merci pour ces précisions. L'idée étant de fournir ces fiches à un public qui est censé les compléter sous cette forme, Word me semblait être la meilleure solution. Mais je comprends les limites de RMarkdown en termes de mise en page, je vais sûrement essayer {officedown] et voir si ça répond à mes attentes.

Logez Maxime a écrit :Bonjour,

juste un ajout sur la fonction sprintf, on peut recycler le même argument plusieurs fois :

Code : Tout sélectionner

sprintf("# Présentation organisme df[%1$d, 1]\nThème = df[%1$d, 2]\nAnnée de création = df[%1$d, 3]\n\\newpage\n", idrow)

Cordialement,
Maxime

Top merci ! :)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité