Подтвердить что ты не робот

Как определить, выполняется ли код в контексте knitr/rmarkdown?

Основываясь на некоторых простых тестах, interactive() имеет значение true при запуске кода внутри rmarkdown::render() или knitr::knit2html(). То есть простой файл .rmd, содержащий

```{r}
print(interactive())
```

предоставляет HTML файл, который сообщает TRUE.

Кто-нибудь знает о тесте, который я могу запустить в куске кода, который определит, будет ли он выполняться "неинтерактивно", под которым я подразумеваю "внутри knit2html() или render()"?

4b9b3361

Ответ 1

Как Yihui предложил на github isTRUE(getOption('knitr.in.progress')) можно использовать, чтобы определить, запущен или запущен код в интерактивном режиме.

Ответ 2

Более простое предложение для вашего собственного: см., можете ли вы получить доступ к текущим параметрам куска.

```{r, echo = FALSE}
inside_knitr = function() {
    length(knitr::opts_current$get()) > 0
}
```

```{r}
inside_knitr()
```

Есть, конечно, много вещей, которые вы могли бы проверить. Мне нравится идея текущих вариантов блоков, другая возможность ниже. Я не совсем уверен в плюсах и минусах.

```{r}
!is.null(knitr::opts_knit$get("out.format"))
```

Ответ 3

Я подозреваю (?), что вам может просто понадобиться бросить свой собственный.

Если это так, то здесь один подход, который, кажется, отлично работает. Он работает, извлекая имена всех функций в стеке вызовов, а затем проверяет, имеет ли какой-либо из них имя "knit2html" или "render". (В зависимости от того, насколько вам это необходимо, вы можете выполнить дополнительную проверку, чтобы убедиться, что это действительно функции в пакетах knitr и rmarkdown, но общий идея все равно будет такой же.)

```{r, echo=FALSE}
isNonInteractive <- function() {
    ff <- sapply(sys.calls(), function(f) as.character(f[[1]]))
    any(ff %in% c("knit2html", "render"))
}
```

```{r}
print(isNonInteractive())
```