Изменить глобальную среду при рендеринге документа RMarkdown - PullRequest
3 голосов
/ 31 октября 2019

Рассмотрим этот минимальный пример RMarkdown, сохраненный в файле test.rmd:

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

Если вы отобразите этот файл с rmarkdown::render("test.rmd"), объект foo будет найден в вашей глобальной среде:

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

Аналогично, если в глобальной среде определено foo, оно будет изменено:

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

Пока все хорошо.

Однако,по моим собственным причинам я хочу обернуть другую функцию вокруг render(), например

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

Теперь, когда я вызываю myrender("test.rmd"), переменная foo экспортируется в родительскую среду, в данном случаек среде в myrender, и я больше не могу получить к ней доступ из глобальной среды:

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

Хотя это ожидаемое поведение, я все же хотел бы, чтобы render изменил глобальная среда. Как мне этого добиться?

1 Ответ

4 голосов
/ 31 октября 2019

Позвольте мне поставить префикс, сказав, что я считаю, что это очень плохая идея. Рендеринг должен происходить в своей собственной области, и в идеале в своем собственном R-процессе, именно для того, чтобы избежать помех (я бы даже пошел дальше: тот факт, что это работает по умолчанию, является недостатком корректности в API).

НоВы можете передать оценочную среду на rmarkdown::render:

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