【问题标题】:how to tell if code is executed within a knitr/rmarkdown context?如何判断代码是否在 knitr/rmarkdown 上下文中执行?
【发布时间】:2016-01-11 12:18:59
【问题描述】:

基于一些简单的测试,interactive()rmarkdown::render()knitr::knit2html() 内运行代码时为真。也就是说,一个简单的.rmd 文件包含

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

给出一个报告TRUE的HTML文件。

有谁知道我可以在代码块中运行的测试,以确定它是否“非交互地”运行,我的意思是“在 knit2html() 或 render() 内”?

【问题讨论】:

    标签: r knitr r-markdown


    【解决方案1】:

    Yihui suggested on githubisTRUE(getOption('knitr.in.progress')) 可以用来检测代码是被编织还是交互执行。

    【讨论】:

    • 为什么在使用Rscript -e "rmarkdown::render(...)" 在shell 脚本中编织时未设置knitr.in.progress(即isTRUE(getOption('knitr.in.progress')) 返回FALSE)? @yihui-xie ?
    • 你试过!is.null(getOption("knitr.in.progress"))吗?
    【解决方案2】:

    一个自己滚动的简单建议:看看你是否可以访问当前的输出格式:

    ```{r, echo = FALSE}
    is_inside_knitr = function() {
            !is.null(knitr::opts_knit$get("out.format"))
    }
    ```
    
    ```{r}
    is_inside_knitr()
    ```
    

    当然,您可以检查很多事情 - 这不是这些功能的预期用途,因此它可能不是最强大的解决方案。

    【讨论】:

    • 这必须至少与 && !interactive() 结合,因为当我在当前的交互式 R 会话中运行 length(knitr::opts_current$get()) 时,它会返回 53。底线 - 这种方法不是很有效。
    • 嗯,是的。我当时对此进行了测试-我不会改变。看来我使用 out.format 的第二个建议仍然有效 - 我将删除另一个建议。
    【解决方案3】:

    我怀疑(?)您可能只需要自己动手。

    如果是这样,这是一种似乎表现良好的方法。它通过提取调用堆栈中所有函数的名称来工作,然后检查它们中的任何一个是否命名为"knit2html""render"。 (取决于你需要它有多健壮,你可以做一些额外的检查以确保这些真的是 knitrrmarkdown 包中的功能,但一般想法还是一样的。)

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

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2014-09-21
      • 2018-09-13
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2010-10-13
      • 2018-12-10
      相关资源
      最近更新 更多