[Résolu] Mise en forme conditionnelle de tables

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

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

[Résolu] Mise en forme conditionnelle de tables

Messagepar Gilles San Martin » 26 Aoû 2011, 13:33

Bonjour

Je cherche un moyen d'exporter des tableaux de résultats R vers un format HTML ou compatible avec un traitement de texte (çà c'est facile : R2HTML, xtables,...) mais aussi de changer la mise en forme de chaque cellule en fonction de son contenu.
L'idéal serait même de pouvoir fournir une matrice de mise en forme (par exemple des classes css) de dimensions identiques à mes tableaux pour pouvoir par exemple facilement modifier la mise en forme de la cellule A en fonction du contenu de la cellule B (exemple classique : si la p valeur est <alpha alors met moi telle valeur en rouge).

Est-ce que vous voyez un moyen de faire çà (autre que de tout écrire avec des cat et des paste)?

Je dois générer un grand nombre de tableaux sur base de données qui peuvent changer au cours du temps donc faire la mise en forme à la main par exemple dans un tableur n'est pas une option.

Merci d'avance pour vos suggestions
Gilles

Pierre COLIN
Messages : 350
Enregistré le : 03 Juil 2011, 11:04

Messagepar Pierre COLIN » 26 Aoû 2011, 14:01

une partie de la réponse se trouve peut-etre ici : http://forums.cirad.fr/logiciel-R/viewtopic.php?t=4057

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 26 Aoû 2011, 17:43

Merci pour la suggestion.
Il y a de l'idée mais çà ne semble pas fonctionner comme je voudrais.

Premièrement avec les options align et add.to.row de xtables il ne semble possible d'agir que sur l'entièreté d'une ligne ou d'une colonne.
De plus pour les sortie en HTML il ne semble pas possible d'agir sur une autre option que la position du texte avec l'option align.
Avec l'option add.to.row c'est en théorie possible mais il semble y avoir un bug.

Si je fais par exemple (pour avoir la première ligne avec un fond rouge):

Code : Tout sélectionner

# créer un tableau pour l'exemple
a <- data.frame(A = rnorm(5), B= runif(5), C= rpois(5,2))

b <- xtable(a)
print(b, type="html",add.to.row=list(pos = list(1), command = "bgcolor = \"#FF6F5A\""), file="/home/gilles/bureau/essais.html")


J'obtiens le code html suivant :

Code : Tout sélectionner

<TABLE border=1>
<TR> <TH>  </TH> <TH> A </TH> <TH> B </TH> <TH> C </TH>  </TR>
  <TR> <TD align="right"> 1 </TD> <TD align="right"> -0.06 </TD> <TD align="right"> 0.43 </TD> <TD align="right"> 3.00 </TD> </TR>
   bgcolor = "#FF6F5A"<TR> <TD align="right"> 2 </TD> <TD align="right"> 0.75 </TD> <TD align="right"> 0.29 </TD> <TD align="right"> 0.00 </TD> </TR>
  <TR> <TD align="right"> 3 </TD> <TD align="right"> 0.34 </TD> <TD align="right"> 0.20 </TD> <TD align="right"> 4.00 </TD> </TR>
  <TR> <TD align="right"> 4 </TD> <TD align="right"> 0.70 </TD> <TD align="right"> 0.07 </TD> <TD align="right"> 1.00 </TD> </TR>
  <TR> <TD align="right"> 5 </TD> <TD align="right"> 0.24 </TD> <TD align="right"> 0.12 </TD> <TD align="right"> 0.00 </TD> </TR>
   </TABLE>

Au lieu de :

Code : Tout sélectionner

<TABLE border=1>
<TR> <TH>  </TH> <TH> A </TH> <TH> B </TH> <TH> C </TH>  </TR>
  <TR> <TD align="right"> 1 </TD> <TD align="right"> -0.06 </TD> <TD align="right"> 0.43 </TD> <TD align="right"> 3.00 </TD> </TR>
  <TR bgcolor = "#FF6F5A"> <TD align="right"> 2 </TD> <TD align="right"> 0.75 </TD> <TD align="right"> 0.29 </TD> <TD align="right"> 0.00 </TD> </TR>
  <TR> <TD align="right"> 3 </TD> <TD align="right"> 0.34 </TD> <TD align="right"> 0.20 </TD> <TD align="right"> 4.00 </TD> </TR>
  <TR> <TD align="right"> 4 </TD> <TD align="right"> 0.70 </TD> <TD align="right"> 0.07 </TD> <TD align="right"> 1.00 </TD> </TR>
  <TR> <TD align="right"> 5 </TD> <TD align="right"> 0.24 </TD> <TD align="right"> 0.12 </TD> <TD align="right"> 0.00 </TD> </TR>
   </TABLE>


L'option est bien ajoutée mais en dehors de la balise ... ??

Idéalement, il faudrait pouvoir aller ajouter ce genre d'option dans les balises <TD> de son choix pour mettre en évidence chaque cellule individuellement.

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 29 Aoû 2011, 00:10

Bonjour

Il semble que personne ne soit très inspiré par ma question... J'ai donc mis la main à la pâte et j'ai modifié la fonction de R2HTML qui met en forme les tableaux (matrices et data.frames) pour obtenir ce que je voulais. J'espère que je n'ai pas (trop) réinventé la roue... Voici ce que çà donne au cas où çà pourrait servir à quelqu'un un jour (je n'ai pas de question particulière...).

Cette version est totalement compatible avec la fonction originale (en terme de syntaxe, valeurs par défaut etc...). C'est un premier jet à améliorer mais ça a l'air de fonctionner correctement bien que je n'ai guère eu le temps d'essayer toutes les combinaisons possibles de mises en forme.

Cette réécriture apporte deux changements principaux sur le fond.

Premièrement, on peut attribuer à n'importe quelle case du tableau une classe css (et donc une mise en forme) différente. Au lieu d'être limité à une seule valeur, on peut entrer pour l' option classcellinside une matrice (de dimension identique au tableau). De manière similaire, on peut entrer pour les options classfirstcolumn et classfirstline un vecteur de longueur égale aux nombre de lignes et aux nombre de colonnes (+1 si row.names =TRUE) respectivement. On garde aussi la possibilité de n'entrer qu'une valeur unique (comme dans la version originale) qui sera alors la même pour toutes les cellules.

Deuxièmement on peut ajouter n'importe quel string de mise en forme dans les différentes cases (balises) du tableau et donc faire la mise en forme en se passant des feuilles css. Cette approche peut paraître curieuse puisque les feuilles de style css sont effectivement la manière la plus propre et la plus puissante de travailler. Je vois cependant 2 avantages à cette approche : premièrement on ne doit pas aller éditer les feuilles de styles et donc on obtiens un résultat directement exploitable et deuxièmement, la mise en forme via les feuilles css est perdue lorsqu'on ouvre le document HTML dans un traitement de texte comme LibreOffice Writer alors que si les commandes de mise en forme se trouvent directement dans le tableau, on peut récupérer la majeure partie de la mise en forme.
Il y a 5 nouvelles options qui peuvent contenir ces strings de mise en forme dont la valeur est nulle par défaut: optfirstline = NULL, optfirstcolumn = NULL, optcellinside=NULL, opttable=NULL, optinnertable=NULL. Le 3 premiers ont un comportement similaire aux options de classes et peuvent recevoir une valeur unique, un vecteur (pour les deux premières) ou une matrice (pour la 3ème). Les deux dernières peuvent prendre comme valeur uniquement un vecteur string de longueur = 1 et vont placer les options de mise en forme dans les deux balises <table> qui constituent chaque tableau (la première étant un tableau à une seule cellule contenant le vrai tableau sauf si Border = NULL auquel cas on a un seul tableau).


Voici la fonction et deux exemples. C'est surtout la deuxième partie de la fonction qui a été modifiée. J'ai aussi désactivé l'option sortableDF dont je ne comprend pas l'utilité et qui aurait pu causer des problèmes

Code : Tout sélectionner

HTML.data.frame2 <-

function (x, file = get(".HTML.file"), Border = 1, innerBorder = 0,
    classfirstline = "firstline", classfirstcolumn = "firstcolumn",
    classcellinside = "cellinside", append = TRUE, align = "center",
    caption = "", captionalign = "bottom", classcaption = "captiondataframe",
    classtable = "dataframe", digits = getOption("R2HTML.format.digits"),
    nsmall = getOption("R2HTML.format.nsmall"), big.mark = getOption("R2HTML.format.big.mark"),
    big.interval = getOption("R2HTML.format.big.interval"), decimal.mark = getOption("R2HTML.format.decimal.mark"),
   # sortableDF = getOption("R2HTML.sortableDF"),
    row.names = TRUE, optfirstline = NULL, optfirstcolumn = NULL, optcellinside=NULL, opttable=NULL, optinnertable=NULL, ...)
{
    cat("\n", file = file, append = append)

    # sortableDF removed from this version

#     if (is.null(sortableDF))
#         sortableDF = FALSE
#     if (sortableDF)
#         cat(paste(c("\n<style>", ".tablesort  {", "cursor: pointer ;",
#             " behavior:url(tablesort.htc);", " -moz-binding: url(moz-behaviors.xml#tablesort.htc);",
#             "}", "</style>\n"), collapse = "\n"), file = file,
#             append = TRUE)

    txt <- paste("\n<p align=", align, ">")
   
    # caption
    txtcaption <- ifelse(is.null(caption), "", paste("\n<caption align=",
        captionalign, " class=", classcaption, ">", caption,
        "</caption>\n", sep = ""))

    # table and table styles (NEW : opttable and optinnertable stuff)
    if (!is.null(Border)){
        txt <- paste(txt, "\n<table ",opttable, if(!is.null(opttable)) ";"," cellspacing=0 border=", Border,
            ">", txtcaption, "<tr><td>", "\n\t<table border=",
            innerBorder," ", if(!is.null(classtable)) "class=", classtable, " ",optinnertable, ">", sep = "")} else {
   txt <- paste(txt, "\n<table border=", innerBorder, " class=",
        classtable," ", optinnertable , if(!is.null(optinnertable)) ";", " cellspacing=0>", txtcaption, sep = "")}

    txt <- paste(txt, "\t<tbody>", sep = "\n")

    # formating the data
    x.formatted <- format(x, digits = digits, nsmall = nsmall,
        big.mark = big.mark, big.interval = big.interval, decimal.mark = decimal.mark)
    x.formatted <- as.matrix(x.formatted)
    x.formatted[is.na(x.formatted)] <- " "
    x.formatted[is.nan(x.formatted)] <- " "
    x.formatted[x.formatted == "NaN"] <- " " # New (avoid the use of HTMLReplaceNA)
    x.formatted[x.formatted == "NA"] <- " "  # New (avoid the use of HTMLReplaceNA)

#########################################################################################
## part strongly modified

    if(is.vector(classcellinside) & length(classcellinside)==1) classcellinside <- matrix(classcellinside, dim(x)[1], dim(x)[2])
    if(is.vector(optcellinside) & length(optcellinside)==1) optcellinside <- matrix(optcellinside, dim(x)[1], dim(x)[2])

    # col names

    if(row.names)  tabnames <- c("&nbsp;", dimnames(x)[[2]]) else tabnames <- dimnames(x)[[2]] # add empty colname above the row names if necessary
    if(length(optfirstline) == 1) optfirstline <- rep(optfirstline, length(tabnames))

    if(length(classfirstline) == 1 & is.null(optfirstline)) { # same options and behavior as the original R2HTML.data.frame
   tabnames <- paste("<th> ", tabnames, " </th>", sep="")
   tabnames[1] <- paste("<tr class= ", classfirstline,  ">", tabnames[1], sep="")
   tabnames[length(tabnames)] <- paste(tabnames[length(tabnames)], "</tr> \n", sep="")
   } else {
   if (length(classfirstline) == length(tabnames)-1) classfirstline <- c("noclass", classfirstline) # add a warning ?
   if (length(optfirstline) == length(optfirstline)-1) optfirstline <- c("", optfirstline)
   tabnames <- paste("<th ", if(!is.null(classfirstline)) "class=", classfirstline, " ", optfirstline ,"> ", tabnames, " </th>", sep="")
   tabnames[1] <- paste("<tr>", tabnames[1], sep="")
   tabnames[length(tabnames)] <- paste(tabnames[length(tabnames)], "</tr> \n", sep="")
   }

    # row names
    if(row.names) tabrownames <- paste("<td ", if(!is.null(classfirstcolumn)) "class=", classfirstcolumn, " ", optfirstcolumn ,"> ", dimnames(x)[[1]], " </td>", sep="")

    # cells inside the table

    tab <- matrix(paste("<td ", if(!is.null(classcellinside)) "class=",  classcellinside, " ", optcellinside ,"> ", x.formatted, " </td>", sep=""), dim(x)[1], dim(x)[2])
    if(row.names) tab <- cbind(tabrownames, tab)
    tab[,1] <- paste("<tr>", tab[,1])
    tab[,dim(tab)[2]] <- paste( tab[,dim(tab)[2]],"</tr> \n")
    tab <- rbind(tabnames, tab)

    tab <- do.call("paste",as.list(t(tab))) # paste all the matrix cells in one string

    txt <- paste(txt, tab, "\n\t</tbody>\n</table>\n", if (!is.null(Border)) "</td></table>\n", "<br>")

    cat(txt, "\n", file = file, sep = "", append = TRUE)
}



Pour illustrer, voici un exemple (simpliste) pour une matrice de corrélation où l'on veut colorer en rouge les corrélations positives R > 0.5 et en vert les corrélations négatives R< -0.5. (Bien sûr pairs() serait plus indiquée dans ce cas mais c'est juste pour donner une idée)
On construit donc la matrice de corrélation et une matrice de taille identique contenant les noms des classes css correspondant :

Code : Tout sélectionner

data(swiss)
x <- cor(swiss)

# example using CSS classes
style <- matrix("cellinside", dim(x)[1], dim(x)[2])
style[x > 0.5 & x != 1] <- "emphasis1"
style[x < -0.5] <- "emphasis2"


On utilise HTMLStart et HTMLStop qui associent le html avec une feuille css propre au package. Le tout se trouve dans un répertoire temporaire dont le chemin est donné dans la console.

Code : Tout sélectionner

library(R2HTML)
HTMLStart(filename = "swiss", echo = FALSE)
HTML.data.frame2(x, classcellinside = style)
HTMLStop()


Il faut encore ajouter les deux nouveau styles en collant ce qui suit dans le fichier R2HTML.css :

Code : Tout sélectionner

TD.emphasis1 {
    padding: 5 10;
    background: #FF6F5A;
    text-align=right
}

TD.emphasis2 {
    padding: 5 10;
    background: #A0FFAD;
    text-align=right
}


Et on obtient le résultat suivant :

Image


Le deuxième exemple montre comment obtenir un résultat similaire sans utiliser les feuilles de style et pouvoir importer le tableau avec l'essentiel de sa mise en forme dans un traitement de texte.
On crée d'abord des chaînes de caractères pour chaque type de mise en forme. Ici j'ai utilisé la syntaxe css mais on peut aussi utiliser la syntaxe HTML classique (pex : "bgcolor=\"#A0FFAD\" ; align = \"right\"") En suite on crée une matrice de taille identique au données comme dans l'exemple précédent. On peut ensuite créer directement un fichier html sans feuille de style associée.

Code : Tout sélectionner

optFirstCol <- "style = \" padding: 5 10; background: #C0C0C0; text-align:center;font-family: Arial, sans-serif; font-size: 10pt  \""
optFirstRow <- "style = \" padding: 5 10; color: #FFFFFF; background: #000000; text-align : left ;font-family: Arial, sans-serif; font-size: 10pt \""
optCells <- "style = \" padding: 5 10; background: #FFFFFF; text-align : center ;font-family: Arial, sans-serif; font-size: 10pt\""
emphasis1 <- "style = \" padding: 5 10; background: #FF6F5A; text-align : center ;font-family: Arial, sans-serif; font-size: 10pt\""
emphasis2 <- "style = \" padding: 5 10; background: #A0FFAD; text-align : center ;font-family: Arial, sans-serif; font-size: 10pt\""

style <- matrix(optCells, dim(x)[1], dim(x)[2])
style[x > 0.5 & x != 1] <- emphasis1
style[x < -0.5] <- emphasis2

HTML.data.frame2(x, file = "/home/gilles/bureau/swiss_no_css.html", optfirstline = optFirstRow, optfirstcolumn = optFirstCol, optcellinside=style, optinnertable = optTable)

Dominique Soudant
Messages : 751
Enregistré le : 23 Avr 2008, 11:12
Contact :

Re: [Résolu] Mise en forme conditionnelle de tables

Messagepar Dominique Soudant » 29 Aoû 2011, 07:55

Bonjour,

Relativement à ton cahier des charges initial :
Gilles San Martin a écrit :Je cherche un moyen d'exporter des tableaux de résultats R vers un format HTML ou compatible avec un traitement de texte (çà c'est facile : R2HTML, xtables,...) mais aussi de changer la mise en forme de chaque cellule en fonction de son contenu.
quelle est la différence entre OdfSweave et ce que tu proposes ?

Pour mémoire, OdfWeave permet précisément de faire des tableaux avec mise en forme conditionnelle des cellules et produit un document OpenOffice.

@+

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 29 Aoû 2011, 08:32

Bonjour

Je ne connais pas bien odfWeave. A l'époque où j'ai exploré les différentes possibilités pour mettre en forme des rapports depuis R, je n'avais pas trouvé la possibilité dans odfWeave de générer les mêmes graphiques et les mêmes tables pour un ensemble de sous-groupes des données.

Si on reprend l'exemple des données Suisses, on pourrait imaginer qu'on aie un jeu de données similaire pour l'ensemble des pays du monde et qu'on veuille générer pour chaque pays un titre, une matrice de corrélation, les résultats d'une PCA et un graphique représentant les deux premiers axes le tout dans un seul rapport généré automatiquement, les pays les uns à la suite des autres.

Si c'est possible çà m'intéresserait beaucoup de savoir comment on fait en odfWeave... D'autant plus que mon but dans beaucoup de cas est d'importer mon html final dans writer...

J'avais trouvé comment faire en Sweave mais la courbe d'apprentissage de Latex et les difficultés d'édition du document final pour quelqu'un qui ne connaît pas Latex m'avaient orienté vers l'HTML.

Mais je cherche encore une solution qui me convienne vraiment donc les suggestions d'autres approches sont vraiment bien venues

Dominique Soudant
Messages : 751
Enregistré le : 23 Avr 2008, 11:12
Contact :

Messagepar Dominique Soudant » 29 Aoû 2011, 10:00

Gilles San Martin a écrit :on veuille générer pour chaque pays un titre, une matrice de corrélation, les résultats d'une PCA et un graphique représentant les deux premiers axes le tout dans un seul rapport généré automatiquement, les pays les uns à la suite des autres.

Si c'est possible çà m'intéresserait beaucoup de savoir comment on fait en odfWeave...
Avec Word (office 2003 et XP) :
Préparer un template dans word en remplaçant les éléments que l'on veut insérer par un mot clé. Pour les talbleaux, s'ils ont une taille variable alors il faut les générer en html s'ils ont une taille fixe alors on peut associer à chaque cellule un mot clé. Enregistrer le template en html à la sauce word, pas du beau html W3C, du html caca à la word. Ensuite faire un programme stockant tous les résultats dans un tableau à raison d'une ligne par tableau, on peut aussi imaginer une structure avec une liste de listes, c'est à faire compte tenu des contraintes et des préférences. On gagnera à faire un tableau avec comme titre de colonne les mots clé du template. Finalement, charger la strucutre de résultat (liste de listes ou tableau), lire le template avec readlines, puis pour chaque pays, parcourir ce dernier objet en cherchant les mots clés, les remplacer par leur valeur, insérer les graphiques et les tableaux en mode html, sauvegarder. Les différents fichiers ainsi produits peuvent être insérés dans un document Word vierge, par grappe de 59 dans word 2003, moins avant et après cette version. Lors de l'insertion des fichiers, commençer la multiselection par le dernier puis (shift+clic) le premier : dans l'autre ordre, le dernier sera le premier inséré suivi du premier, second etc.

C'est moins compliqué que cela en a l'air. C'est de cette manière que sont produits les rapports d'évaluation présents ici :
http://envlit.ifremer.fr/documents/publications
Section Directive cadre sur l'eau.

Je reviens pour parler Odfweave.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 29 Aoû 2011, 11:17

Gilles San Martin a écrit :Bonjour

Il semble que personne ne soit très inspiré par ma question... J'ai donc mis la main à la pâte et j'ai modifié la fonction de R2HTML qui met en forme les tableaux (matrices et data.frames) pour obtenir ce que je voulais. J'espère que je n'ai pas (trop) réinventé la roue... Voici ce que çà donne au cas où çà pourrait servir à quelqu'un un jour (je n'ai pas de question particulière...).


Bonjour Gilles,

Merci pour cette contribution. Le résultat est très intéressant. Je mets un lien sur ce fil de discussion dans la rubrique Scripts.
Renaud

Dominique Soudant
Messages : 751
Enregistré le : 23 Avr 2008, 11:12
Contact :

Messagepar Dominique Soudant » 29 Aoû 2011, 11:18

Je n'ai pas d'expérience concrète de production de masse de documents avec OdfWeave, pas encore ... Avant de commencer il faut réaliser que SWeave, et par extension, OdfWeave n'a pas été conçu au départ pour produire du document en masse, du reporting. J'imagine qu'il a plutôt été pensé pour 2 objectifs : 1) maintenir une publi cohérente relativement aux petits changements qui peuvent intervenir en cours de rédaction jusqu'à la soumission, 2) produire à échéance régulière un rapport au format figé.

Produire en masse des documents ne rentre pas forcément directement dans ses cordes. Cela dit, je suis convaincu qu'il y a moyen de s'en arranger. Pour commencer on peu imaginer un mode fonctionnement identique à celui décrit plus haut : une modèle de document, une structure de résultats générée par ailleurs, un programme chargeant l'un et l'autre et produisant une feuille de résultat par pays. Je bloque sur l'insertion des différentes feuilles dans un document odf, mais c'est surement tout à fait réalisable, j'ai déjà fait des essai du coté des documents maitres et esclaves. Toutefois je suis presque sûr que l'on doit pouvoir réaliser l'opération sans collation séparée des documents, c'est à dire la production directe d'un documents contenant tous les résultats pour tous les pays. Une solution peut être de préparer une fonction réalisant les mises en page par un pays et de l'appeler ensuite avec un by().

En bref, je n'ai pas de soluce toute prête mais y a surement moyen d'arriver à ses fins.

EDIT :
Un petit soucis avec OdfWeave et les tableaux signalé ici :
viewtopic.php?t=3948&highlight=

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 29 Aoû 2011, 11:26

Merci pour le retour [ Edit : et merci Renaud pour le lien dans la partie Scripts]

C'est très intéressant je trouve de voir comment d'autres travaillent. Les annexes des rapports que tu cites correspondent effectivement au type de document que j'ai en tête sauf qu'il s'agit plus dans mon cas de rapports pour usage privé (exploration/visualisation des données) que pour publication finale.

Si je comprend bien (pas certain) on fait plus ou moins la même chose mais en le prenant par un autre bout. Tu écris un template en word qui est transformé ensuite en html et tu remplaces les mots clés par les graphiques, valeurs et tableaux avec R dans la version HTML. Moi je génère directement le HTML dans R (avec la contrainte d'essayer de deviner quel html tout pourri writer est capable de comprendre ;-) ) que j'importe ensuite dans Writer si nécessaire.

Une chose qui me pose problème dans l'approche que tu décris (outre que çà me semble complexe - mais mon avis est sûrement biaisé) c'est que -si j'ai bien compris - pour chaque type d'écosystème littoral (ou chaque pays dans mon exemple) tu dois copier-coller le même template (c'est ce qu'il faut faire aussi avec odfWeave je pense, pour le peu que j'en sais). Ce qui veut dire que si tu veux faire une modification quelconque dans les tableaux, leur ordre, ajouter une figure etc..., il faut tout recommencer (re-copier-coller et modifier les mots clés) et que le nombre de groupes (pays, ecosystèmes littoraux) est fixé à l'avance.

Vu l'utilisation que j'en ai mes rapports doivent être dynamiques. Je modifie en permanence le nombre de groupes (nombre d'espèces par exemple dans mon cas en fonction du groupe taxonomique étudié ou de la disponibilité des données), figures, tableaux inclus ou non, leur ordre, leur mise en forme etc...
L'approche que tu proposes et odfWeave semblent plus adaptés à un rapport plus ou moins définitif dans sa structure pour lequel on devrait régulièrement modifier la source de données (qui doit rester de structure parfaitement identique) et éventuellement des commentaires sur ces résultats. Par contre avec l'approche R2HTML, si j'édite mon rapport dans writer en rajoutant par exemple du texte ou des commentaires, je ne peux plus mettre à jour les graphiques, tableaux valeurs sur base de nouvelles données sans perdre ce que j'ai édité...

Gilles

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 29 Aoû 2011, 11:45

Nos messages se sont croisés mais il semble que l'on aille dans le même sens : odfWeave ne semble pas prévu au départ pour les document de masse mais il doit y voir moyen de s'en sortir. La question est comment (si qqn a une idée).

En Sweave, Jean Lobry explique comment s'en sortir (chapitre 5.9, p.21):
http://pbil.univ-lyon1.fr/R/pdf/tdr78.pdf
Mais il s'agit de générer du code Latex au sein d'une boucle R comme on génère du code HTML au sein de boucles R. L'idéal serait de pouvoir faire qqchose comme çà pour odfWeave ...

R2HTML me semble par contre particulièrement indiqué pour ce genre de travail de masse. Par exemple :

Code : Tout sélectionner

library(R2HTML)
HTMLStart(filename = "trends", echo = FALSE)

for(i in 1:length(coxsp)) {
HTML.title(coxsp[i])

HTMLInsertGraph(as.character(paste("/home/gilles/stats/R/WorkingDirectory/rprojects/201106_atlas_ladybirds/graphs/maps/",coxsp[i], ".png", sep="")))

HTML.title("observations (date x UTM1 x Observer)", 3)
HTML(trend.layout(a, sp = coxsp[i])[[1]])

HTML.title("UTM 1km", 3)
HTML(trend.layout(a, sp = coxsp[i])[[2]])

HTML.title("UTM 5km", 3)
HTML(trend.layout(a, sp = coxsp[i])[[3]])

    }
HTMLStop()


Génère un document avec pour chaque espèce comprise dans le vecteur coxsp un titre, une carte (générées au préalable dans une boucle similaire et stockées sur le disque) et 3 tableaux (mis en forme avec la fonction maison trend.layout) avec des sous-titres. Modifiable à souhait et possible de l'importer dans un traitement de texte pour le coller en annexe d'un rapport par exemple.


Retourner vers « Questions en cours »

Qui est en ligne

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