3 votes

Modifier l'environnement global lors du rendu du document RMarkdown

Considérons cet exemple minimal de RMarkdown, enregistré dans le fichier test.rmd :

```{r}
foo <- "bar"
```

Si vous rendez ce fichier avec rmarkdown::render("test.rmd") l'objet foo se trouveront dans votre environnement global :

> foo
Error: object 'foo' not found
> rmarkdown::render("test.rmd")
[...]
Output created: test.html
> foo
[1] "bar"
> 

De même, si foo ont été définis dans l'environnement global, il sera modifié :

> foo <- "baz"
> rmarkdown::render("test.rmd")
[...]
Output created: test.html
> foo
[1] "bar"

Jusqu'à présent, tout va bien.

Cependant, pour des raisons qui me sont propres, je veux envelopper une autre fonction autour de render() par exemple

myrender <- function(f) render(f, output_format="html_document")

Maintenant, quand j'appelle myrender("test.rmd") le foo est exportée vers l'environnement parent, dans ce cas, vers l'environnement au sein de myrender et je ne peux plus y accéder depuis l'environnement global :

> myrender("test.rmd")
[...]
Output created: test.html
> foo
Error: object 'foo' not found

Bien qu'il s'agisse du comportement attendu, je souhaiterais néanmoins que l'option render pour modifier le mondial l'environnement. Comment y parvenir ?

4voto

Konrad Rudolph Points 231505

Permettez-moi de commencer en disant que je pense que c'est une très mauvaise idée. Le rendu devrait se faire dans son propre scope, et idéalement dans son propre processus R, précisément pour éviter les interférences (j'irais même plus loin : le fait que cela fonctionne par défaut est un défaut de correction dans l'API).

Mais vous pouvez passer un environnement d'évaluation à rmarkdown::render :

myrender <- function(f) render(f, output_format = "html_document", envir = globalenv())

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