R mise en marché nombre HTML chiffres

Est-ce que quelqu'un sait compter les chiffres dans les légendes, pour le format HTML R Markdown script?

pour les documents PDF, La légende dira quelque chose comme:

Figure X: Certains Légende De Texte

cependant, la légende équivalente pour la version HTML dira simplement:

Une Légende De Texte

cela rend les références croisées des chiffres par nombre complètement inutiles.

Voici un minimes exemple:

---
title: "My Title"
author: "Me"
output:
  pdf_document: default
  html_document: default
---

```{r cars, fig.cap = "An amazing plot"}
plot(cars)
```


```{r cars2, fig.cap = "Another amazing plot"}
plot(cars)
```

j'ai essayé la configuration de toc,fig_caption et number_sections dans chacun des formats de sortie, mais cela ne semble pas changer le résultat.

10
demandé sur Michael Harper 2016-05-09 16:07:42

4 réponses

donc, à moins que quelqu'un ait une meilleure solution, c'est la solution que j'ai trouvée, il y a quelques failles dans cette approche (par exemple, si le chiffre/numéro de tableau dépend du numéro de section, etc...), mais pour le document html de base, cela fonctionne.

quelque part en haut de votre document, exécutez ceci:

```{r echo=FALSE}
#Determine the output format of the document
outputFormat   = opts_knit$get("rmarkdown.pandoc.to")

#Figure and Table Caption Numbering, for HTML do it manually
capTabNo = 1; capFigNo = 1;

#Function to add the Table Number
capTab = function(x){
  if(outputFormat == 'html'){
    x = paste0("Table ",capTabNo,". ",x)
    capTabNo <<- capTabNo + 1
  }; x
}

#Function to add the Figure Number
capFig = function(x){
  if(outputFormat == 'html'){
    x = paste0("Figure ",capFigNo,". ",x)
    capFigNo <<- capFigNo + 1
  }; x
}
```

puis pendant le cours de votre document, si vous dites que vous voulez tracer un chiffre:

```{r figA,fig.cap=capFig("My Figure Caption")
base = ggplot(data=data.frame(x=0,y=0),aes(x,y)) + geom_point()
base
```

Remplacer capFigcapTab dans le ci-dessus, si vous voulez une légende du tableau.

3
répondu Nicholas Hamilton 2016-05-10 23:03:24

On peut utiliser pandoc-crossref, un filtre qui permet un renvoi des figures, des tableaux, des sections et des équations et fonctionne pour tous les formats de sortie. La façon la plus simple est de cat l'étiquette de la figure (sous la forme de {#fig:figure_label}) après chaque parcelle, bien que cela nécessite une echo=FALSE et results='asis'. Alors nous pouvons faire référence à une figure comme nous le ferions à une citation:[@fig:figure_label] produit fig. figure_number par défaut.

Voici un MWE:

---
output: 
  html_document:
    toc: true
    number_sections: true
    fig_caption: true
    pandoc_args: ["-F","pandoc-crossref"]
---

```{r}
knitr::opts_chunk$set(echo=FALSE,results='asis')

```


```{r plot1,fig.cap="This is plot one"}
x <- 1:10
y <- rnorm(10)
plot(x,y)
cat("{#fig:plot1}")

```

As we can see in [@fig:plot1]... whereas [@fig:plot2] shows...

```{r plot2, fig.cap="This is plot two"}
plot(y,x)
cat("{#fig:plot2}")

```

qui produit (en enlevant les graphismes

PLOT1

Figure 1: c'est la première parcelle

comme on peut le voir dans la figure. 1 ... alors que fig. 2 montre...

PLOT2

Figure 2: c'est la deuxième parcelle

voir le pandoc-crossref readme pour plus d'options et de personnalisations.

pour installer pandoc-crossref, en supposant que vous avez une installation haskell:

cabal update
cabal install pandoc-crossref
2
répondu scoa 2016-05-11 10:27:16

Je résous les références croisées en utilisant une solution similaire à celle Postée par Nicholas ci-dessus. J'utilise bookdown pour certains projets, mais je trouve que c'est maladroit à utiliser pour d'autres projets où je veux juste des références croisées simples.

j'utilise ce qui suit lorsque je rédige un article avec rmarkdown et je le veux dans un format standard pour soumission à un journal. Je veux une légende des figures à la fin, puis des tableaux, puis j'aurai les tableaux et les figures. En écrivant, je n'ai qu'une idée approximative de quel ordre les chiffres seront référencées dans le texte. Je veux juste les renvoyer avec un code de texte comme fig: foobar et avoir le numéro assigné l'apparence basée dans le texte. Quand je regarde la liste des légendes des figures, je vais voir dans quel ordre mettre les légendes et les déplacer au besoin.

Voici ma structure.

j'ai un paquet R où j'ai des choses dont j'ai besoin pour des papiers, comme diverses bibliographies et fonctions d'aide. Dans ce paquet, j'ai l' fonction suivante qui utilise certaines variables définies dans l'environnement Rmd principal:.rmdenvir et .rmdctr .

ref <- function(useName) {
require(stringr)
if(!exists(".refctr")) .refctr <- c(`_` = 0)
if(any(names(.refctr)==useName)) return(.refctr[useName])
type=str_split(useName,":")[[1]][1]
nObj <- sum(str_detect(names(.refctr),type))
useNum <- nObj + 1
newrefctr <- c(.refctr, useNum)
names(newrefctr)[length(.refctr) + 1] <- useName
assign(".refctr", newrefctr, envir=.rmdenvir)
return(useNum)
}

il suppose que je nomme des choses que je veux référencées avec quelque chose comme cntname:foo, par exemple fig:foo. Il fait un nouveau compteur pour chacun et je peux faire de nouveaux compteurs à la volée (en écrivant) si nécessaire.

Dans mon principal Mdm fichier, j'ai un set-up lignes:

    ```{r setup_main}
    require(myPackageforPapers)
    # here is where the variables needed by ref() are defined.
    .rmdenvir = environment()
    .refctr <- c(`_` = 0)
    ````

Dans le texte, j'utilise le suivant

    You can see what I am trying to show in Figure `r ref("fig:foo")`
    and you can see it also in Tables `r ref("tab:foo")` 
    and A`r ref("tabappA:foobig")`.

pour obtenir "vous pouvez voir ce que j'essaie de montrer dans la Figure 1 et vous pouvez le voir aussi dans les tableaux 1 et A1."Bien que les nombres puissent ne pas être 1; le nombre à utiliser sera déterminé dynamiquement. Je n'ai pas besoin d'utiliser une fonction spéciale pour la première fois je me réfère à une figure, une table ou quoi que ce soit que je compte. ref () le découvre en regardant si l'étiquette existe déjà. Si non, elle attribue le numéro suivant, et le renvoie. Donc vous n'avez pas à utiliser " étiquette" en un seul lieu et "ref" dans un autre.

au cours de la rédaction, je pourrais décider que l'annexe A devient trop grande, et que je vais diviser certains des tableaux en une annexe B. Tout ce que je dois faire est de changer ce qui précède à

    You can see what I am trying to show in Figure `r ref("fig:foo")`
    and you can see it also in Tables `r ref("tab:foo")` 
    and B`r ref("tabappB:foobig")`.

je spécifie juste un nouveau nom de compteur 'tabappB' et les nombres pour qui sont déterminés dynamiquement.

a la fin de mon fichier Rmd, j'ai une liste de figures qui ressemblera à

    # Figure Legends

    Figure `r ref("fig:foo")`. This is the legend for this figure.

    Figure  `r ref("fig:foo2")`. This is the legend for another figure.

Puis mes tables apparaissent comme

    ```{r print-tablefoo, echo=FALSE}
    tablefoo=mtcars
    thecap = "Tables appear with a legend while figures do not."
    fullcap = paste("Table ", ref("tab:foo"), ". ", thecap, sep="")
    kable(tablefoo, caption=fullcap)
    ```

et puis les chiffres comme suit:

    ```{r fig-foo, echo=FALSE, fig.cap=paste("Figure",ref("fig:foo"))}
    plot(1,1)
    ```

L'Annexe A est un fichier Rmd qui comprend un enfant. Il va avoir des tableaux comme

    ```{r print-tableAfoo, echo=FALSE}
    tablefoo=mtcars
    thecap = "This is a legend."
    fullcap = paste("Table A", ref("tabappA:foobig"), ". ", thecap, sep="")
    kable(tablefoo, caption=fullcap)
    ```

je dois ajouter Un "a" pour obtenir le Tableau A1, mais je le trouve plus facile si R ne pense pas trop pour moi en termes d'étiquetage mes compteurs. Je veux juste qu'il me renvoie le bon numéro.

les références croisées fonctionnent pour html, pdf/latex ou word. Je serais heureux de rester avec des solutions de latex, mais mon les co-auteurs utilisent word donc j'ai besoin d'une solution qui fonctionne avec pandoc et word. Aussi parfois je veux html ou une autre sortie et j'ai besoin d'une solution qui fonctionne pour n'importe quelle sortie qui fonctionne avec rmarkdown.

0
répondu Eli Holmes 2017-11-15 02:59:21

les autres réponses fournies sont relativement périmées, et cela a été rendu très facile depuis lors en utilisant le bookdown package. Ce paquet fournit un certain nombre d'améliorations qui comprend la numérotation intégrée des figures en Word, HTML et PDF.

Pour être en mesure d'utiliser bookdown, vous devez d'abord installer le paquet install.packages("bookdown") puis utilisez l'une de l' formats de sortie. Pour HTML, c'est html_document2. En prenant votre exemple:

---
title: "My Title"
author: "Me"
date:  "1/1/2016"
output: bookdown::html_document2
---


```{r cars, fig.cap = "An amazing plot"}
plot(cars)
```


```{r cars2, fig.cap = "Another amazing plot"}
plot(cars)
```

ces chiffres seront numérotés Figure 1 et Figure 2. A condition que le code soit nommé et ait une légende, nous pouvons faire référence à la sortie en utilisant la syntaxe \@ref(fig:foo)foo est le nom du morceau c'est à dire \@ref(fig-cars). Vous pouvez en apprendre davantage sur ce comportement ici

Autres Lectures

0
répondu Michael Harper 2018-08-07 19:02:48