42 votes

Changer la couleur d'arrière-plan du chunk dans RMarkdown

J'aimerais qu'un certain fragment de code soit mis en évidence dans une couleur différente (par exemple, en rouge) pour indiquer qu'il s'agit d'une mauvaise pratique. Si j'utilisais .Rnw je pourrais ajouter l'option "chunk". background = 'red' et obtenir ce que je veux, mais cela ne semble pas fonctionner en .Rmd . Je pense que je dois créer une feuille de style css personnalisée (mais je ne sais pas quel serait le sélecteur), et peut-être aussi créer un hook personnalisé. J'aimerais que ce soit sur une base par morceau, et non un changement global pour l'ensemble du document.

2 votes

J'ai presque posé la même question récemment, pour des raisons différentes. Je veux formater un chunk différemment selon qu'il est "facultatif" (c'est-à-dire qu'il n'imprime et n'explore que des objets) ou "critique" (c'est-à-dire qu'il est affecté à des objets utilisés en aval). Je suis heureux d'être le juge de cela et de définir explicitement une option de chunk. Ce serait pratique pour l'exposition.

39voto

Ian Lyttle Points 816

Nous pouvons utiliser le class.source dans l'en-tête du bloc de code pour fournir une feuille de style CSS personnalisée à R Markdown. Ceci est expliqué dans le post suivant :

Ajouter une classe CSS à des morceaux de code uniques dans RMarkdown

Pour donner un exemple, je pourrais définir une classe appelée "badCode", puis utiliser un peu de CSS pour modifier l'arrière-plan comme vous le souhaitez. Voici mon .Rmd :

---
output: html_document
---

```{css}
.badCode {
background-color: red;
}
```

```{r mtcars}
summary(mtcars)
```

```{r cars, class.source="badCode"}
summary(cars)
```

0 votes

Très bien. Pourriez-vous expliquer ce que le deuxième appel à paste0() est en train de faire ? Je n'arrive pas à comprendre ce que {.r ...} (avec les triples backticks qui l'entourent) et comment il est traité.

2 votes

Vous avez exposé la différence entre faire fonctionner une chose plusieurs fois et comprendre réellement ce qui se passe :) Je vais faire de mon mieux avec cette dernière. Je pense que le {.r ...} est un signal envoyé à pandoc pour qu'il les traite comme des classes html. Le deuxième appel à paste0() consiste simplement à insérer le contenu de options$class comme le ... sur {.r ...} . Pour info, ma méthode de débogage consistait à regarder le fichier .md (dans RStudio, en utilisant l'option "keep md file").

1 votes

Ahah -- ça aide beaucoup. On dirait que c'est une combinaison des extensions markdown de Pandoc. backtick_code_blocks et fenced_code_attributes qui peut être utilisé pour insérer toutes sortes d'attributs dans un emballage. <pre></pre> étiquette. Voir ici pour la documentation. Merci également pour l'astuce de débogage. J'avais essayé de définir keep_md: true dans mon en-tête YAML, ce qui, pour une raison quelconque, n'a pas fonctionné ici. La prochaine fois que j'aurai des problèmes avec cela, j'essaierai depuis RStudio. Merci pour votre réponse !

35voto

Jim Points 386

N'oubliez pas que le format markdown supporte le HTML en dehors des blocs de code.

J'entourais les morceaux de code d'un div avec une classe personnalisée qui leur donnait le style que je voulais. Dans cet exemple, le code est en bleu et le résultat en bleu clair.

<style>
div.blue pre { background-color:lightblue; }
div.blue pre.r { background-color:blue; }
</style>

<div class = "blue">
```{r bluecars}
summary(cars)
```
</div>

```{r normal}
summary(cars)
```

enter image description here

0 votes

C'est intelligent. Pour une raison quelconque, je me souviens avoir eu des problèmes pour envelopper des morceaux de code. Mais maintenant que j'y pense, c'était probablement lorsque j'ai essayé d'enrouler des <div>/<span>/<section> autour de diapositives en utilisant slidify.

0 votes

Cela fonctionne également pour les différents morceaux de code de langue ; j'ai pu utiliser cela pour pre.js également.

8voto

mkearney Points 688

Cette solution est un peu bricolée, mais elle fonctionne. L'essentiel est de créer deux morceaux de code, en remplaçant l'indicateur {r} par un nom de classe unique. Ensuite, ajoutez du code css pour styliser chaque morceau.

---
output: html_document
---

<style>
pre.bluecars {
    background-color: #aabbff !important;
}
pre.redcars {
    background-color: #ffbbbb !important;
}
</style>

## chunk-specific bg colors

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

- blue

```{bluecars}
summary(cars)
```

```{r, echo=FALSE}
summary(cars)
```

- normal

```{r}
summary(cars)
```

- red

```{redcars}
summary(cars)
```

```{r, echo=FALSE}
summary(cars)
```

screenshot

6voto

maxpe Points 39

J'ai trouvé la méthode suivante pour colorer (coder) des morceaux dans des documents Rmarkdown que je tricote en PDF :

Utiliser un schéma de mise en évidence pandoc comme base

pandoc --print-highlight-style pygments > my.theme

Ensuite, modifiez my.theme en utilisant une expression rationnelle pour définir tous les éléments suivants

"text-color": null

Ensuite, vous pouvez changer cette propriété pour la couleur de votre choix (ici, c'est gris clair).

"background-color": "#f8f8f8"

Dans le YAML de votre document .Rmd sous "pdf_document", mettez ce qui suit

pandoc_args: --highlight-style=my.theme

Pour mon cas d'utilisation, c'est tout ce dont j'ai besoin.

0 votes

Pour exécuter la première commande, vous avez besoin d'un terminal unix et vous devez avoir installé pandoc sur votre machine. Cela m'a aidé dans mon cas, je peux modifier le fichier text-color à ce que je veux + le joli fond gris pour les fichiers PDF.

1voto

LearnUseZone Points 43

Vous pouvez également utiliser les exemples suivants :

```{css, echo = F}
h1 { color: rgb(255, 125, 0); }
h2 { color: brown; }
div.yellow pre { background-color: lightyellow; }
div.yellow pre.r { background-color: lightblue; }
.my_pink1 { background-color: pink; }
.my_pink2 { background-color: rgb(255, 113, 181); color: white; border: 3px solid blue; }
.my_span  { background-color: orange; font-family: courier}
```

# Titre 1
## Titre 2

<div class = "yellow">

```{r yellow_cars1}
summary(cars)
```

</div>

```{r yellow_cars2, class.source = "my_pink1", class.output = "my_pink2"}
summary(cars)
```

Test: <span class = "my_span">change properties</span> \
Roses are $\color{red}{\text{beautiful red}}$,
violets are $\color{blue}{\text{lovely blue}}$.

Pour en savoir plus, consultez par exemple le site
Changer la couleur d'arrière-plan du chunk dans RMarkdown
https://bookdown.org/yihui/rmarkdown-cookbook/chunk-styling.html
Comment changer la couleur de la police ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X