Ответ 1
Как Yihui предложил на github isTRUE(getOption('knitr.in.progress'))
можно использовать, чтобы определить, запущен или запущен код в интерактивном режиме.
Основываясь на некоторых простых тестах, interactive()
имеет значение true при запуске кода внутри rmarkdown::render()
или knitr::knit2html()
. То есть простой файл .rmd
, содержащий
```{r}
print(interactive())
```
предоставляет HTML файл, который сообщает TRUE
.
Кто-нибудь знает о тесте, который я могу запустить в куске кода, который определит, будет ли он выполняться "неинтерактивно", под которым я подразумеваю "внутри knit2html() или render()"?
Как Yihui предложил на github isTRUE(getOption('knitr.in.progress'))
можно использовать, чтобы определить, запущен или запущен код в интерактивном режиме.
Более простое предложение для вашего собственного: см., можете ли вы получить доступ к текущим параметрам куска.
```{r, echo = FALSE}
inside_knitr = function() {
length(knitr::opts_current$get()) > 0
}
```
```{r}
inside_knitr()
```
Есть, конечно, много вещей, которые вы могли бы проверить. Мне нравится идея текущих вариантов блоков, другая возможность ниже. Я не совсем уверен в плюсах и минусах.
```{r}
!is.null(knitr::opts_knit$get("out.format"))
```
Я подозреваю (?), что вам может просто понадобиться бросить свой собственный.
Если это так, то здесь один подход, который, кажется, отлично работает. Он работает, извлекая имена всех функций в стеке вызовов, а затем проверяет, имеет ли какой-либо из них имя "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())
```