参见:https://blog.csdn.net/weixin_44115606/article/details/107433271

https://www.jianshu.com/p/7abaa796ca51

我一直只知道cat 是直接把字符串中的内容输出到屏幕,而print 则是标准化的输出内容,并根据显示显示行号:

06. R 中常见输出函数区别 - 图1

message, warning, stop

message()的输出是醒目的红色。原因是它的输出被作为stderr而不是stdout。messge可用来给用户信息量较大的输出。paste0内置在函数中了。

正因如此,我们可以通过tryCatch 捕获这个“错误状态”:

  1. tryCatch(message("hello\n"), message=function(e){cat("goodbye\n")})
  2. goodbye

06. R 中常见输出函数区别 - 图2

stop 则相当于异常,会把控制权交给用户,输出前带着“error”:

> stop("You must stop here.")
错误: You must stop here.

捕获stop

高效的代码捕捉到错误后有进一步的处理。错误可以用try()和tryCatch捕捉。

> condition <- try(1 + 's', silent = T)
> condition
[1] "Error in 1 + \"s\" : 二进列运算符中有非数值参数\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in 1 + "s": 二进列运算符中有非数值参数>
> condition <- try(1 + 's')
Error in 1 + "s" : 二进列运算符中有非数值参数
> class(condition)
[1] "try-error"

接着我们可以进行相关的处理了:

> condition <- try(1 + 's', silent = T) # silent 使得语句不输出error 信息
> # 下面可以根据判断,捕获异常并进行处理
> if (class(condition) == "try-error") cat("Unvalid argument!")
Unvalid argument!

屏蔽输出的方法

一般来说,message、warning、error 在标准的有输出信息的函数中都会有对应的参数,此时可以进行具体的设置。比如,knitr的chunk options中有error = F, message = F, and warning = F来分别隐藏相应的信息。而results = “hide”将屏蔽所有输出。

除此之外,我们也可以对环境进行全局设置:

suppressWarnings(), suppressMessages(), suppressPackageStartupMessages()等可以隐藏一些信息的输出。这在当你使用knitr,rmarkdown或Sweave来创建动态文档的时候很有用。