【问题标题】:How to control R warnings in knitr to rmarkdown如何将 knitr 中的 R 警告控制为 rmarkdown
【发布时间】:2020-11-26 08:05:00
【问题描述】:

我有一个带有循环的块,它产生线性模型的图像和结果。有时模型会产生不收敛警告。如果我让warning=TRUE 作为块条件,图像和结果会变得完全混乱。但我想打印警告,所以我尝试通过 cat(names(last.warning))(感谢this SO)。然后当knitr:

时我得到下一个错误
Error in eval(expr, envir, enclos) : object 'last.warning' not found
Calls: <Anonymous> ... handle -> withCallingHandlers -> withVisible -> eval -> eval

Execution halted

我能做什么?

谢谢!

【问题讨论】:

    标签: r r-markdown warnings knitr


    【解决方案1】:

    我们的想法是尝试捕获警告并打印其消息。以下示例在 suppressWarnings 调用中,其效果应该与在 warning = FALSE 块中的效果相同。

    这里我要运行的实际代码只是as.numeric(c("1", "A"))。我想打印代码生成的任何警告,尽管它位于 suppressWarnings 块内,并且我还想打印代码的结果:

    suppressWarnings({
    
    #--- Code chunk ----------------------------------------------------------#  
      
      withCallingHandlers(
            expr    = as.numeric(c("1", "A")), 
            warning = function(w) cat("** warning:", w$message, "**\n\n")
      )
    
    #--- End of code chunk ---------------------------------------------------#
    
    })
    
    #> ** warning: NAs introduced by coercion **
    #> 
    #> [1]  1 NA
    

    编辑

    这是一个可重现的 Rmd,它显示了如何在计算结果打印后显示任何警告:

    ---
    title: "test"
    author: "Allan Cameron"
    date: "27 November 2020"
    output: html_document
    ---
    
    ```{r setup, include=FALSE, warning=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
     ```
    
     ## Print warning after output
    
     ```{r test, warning=FALSE}
       withCallingHandlers(
            expr    = as.numeric(c("1", "A")), 
            warning = function(w) warn <<- paste("** warning:", w$message, "**\n\n")
       )
    ```
    
    ```{r print_warn, echo=FALSE}
      if(exists("warn")) cat(warn)
    ```
    

    这会产生:

    【讨论】:

    • 谢谢!我试了一下,得到了和你一样的结果,很好。但是我总是在表达式上方打印警告。如果我尝试将w$message 保存在变量中,使用&lt;-&lt;&lt;- 并尝试在withCallingHandlers 之后打印,我也会收到object not found 错误。有没有可能做点什么?
    • 谢谢!我有一个新的相关(在处理警告方面)问题。可以看看吗?:stackoverflow.com/questions/65035226/…
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2023-03-21
    • 2016-08-22
    • 2015-08-09
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多