TL; DR
为S3对象cat()
创建print.*()
函数时应使用。对于其他所有内容,message()
除非程序状态有问题,否则应使用。例如,可恢复的严重错误给出warning()
与显示停止错误的用法stop()
。
目标
这篇文章的目的是提供有关程序包开发人员可以访问的不同输出选项以及如何构造可能在新对象上或基于字符串的输出的反馈。
R输出概述
传统的输出函数是:
print()
cat()
message()
warning()
stop()
现在,前两个函数(print()
和cat()
)将其输出发送到stdout
标准输出。最后三个函数(message()
,warning()
和stop()
)将其输出发送到stderr
或标准错误。也就是说,将类似命令的结果输出lm()
发送到一个文件,将错误输出(如果存在)发送到一个完全独立的文件。对于用户体验而言,这尤其重要,因为诊断程序不会使结果的输出混乱到日志文件中,从而可以快速查找错误。
为用户和外部程序包设计
现在,以上内容在I / O思维方式中进行了更多的框架化,而不一定是面向用户的框架集。因此,让我们在日常R用户的背景下为其提供一些动力。特别是通过使用3-5或stderr
功能,可以抑制其输出,而无需通过sink()
或修改控制台文本capture.output()
。抑制通常进来的形式suppressWarnings()
,suppressMessages()
,suppressPackageStartupMessages()
,等等。因此,用户仅面临面向结果的输出。如果您打算允许用户灵活地通过knitr,rmarkdown或Sweave创建动态文档时关闭基于文本的输出,那么这尤其重要。
特别是,knitr
提供块选项,如error = F
,message = F
和warning = F
。这样可以减少文档中命令所伴随的文本。此外,这可以防止需要使用results = "hide"
禁用所有输出的选项。
输出细节
打印()
首先,我们有一个老歌,但一个好东西print()
。此功能有一些严重的限制。其中之一是缺乏术语的嵌入级联。第二个可能是更严重的事实是,每个输出之前都带有[x]
实际内容周围的引号。在x
这种情况下指的是正在打印的元件数目。这对于调试目的很有帮助,但除此之外,它没有任何作用。
例如
print("Hello!")
[1] "Hello!"
对于串联,我们依赖与以下paste()
功能同步工作的功能print()
:
print(paste("Hello","World!"))
[1] "Hello World!"
另外,也可以使用paste0(...)
函数代替,paste(...)
以避免默认使用的参数所控制的space元素之间。(又名没有空格的串联)paste()
sep = " "
例如
print(paste0("Hello","World!"))
[1] "HelloWorld!"
print(paste("Hello","World!", sep = ""))
[1] "HelloWorld!"
猫()
另一方面,cat()
解决所有这些批评。最值得注意的是,该sep=" "
的参数paste()
的功能是建立在允许一个跳跃写入paste()
内cat()
。但是,该cat()
功能的唯一缺点是您必须通过\n
在行末尾附加新行或fill = TRUE
(使用默认打印宽度)。
例如
cat("Hello!\n")
Hello!
cat("Hello","World!\n")
Hello World!
cat("Hello","World!\n", sep = "")
HelloWorld!
因此,cat()
在设计print.*()
S3方法时应该使用它。
信息()
该message()
功能是一步比甚至更好cat()
!输出之所以与传统的纯文本截然不同,是因为它指向stderr
而不是stdout
。例如,他们将颜色从标准的黑色输出更改为红色的输出,以引起用户的注意。

此外,您还具有内置paste0()
功能。
message("Hello ","World!")
"Hello World!"
此外,message()
提供了可以与tryCatch()
例如
tryCatch(message("hello\n"), message=function(e){cat("goodbye\n")})
goodbye
警告()
该warning()
功能不是随便使用的东西。警告功能与消息功能的区别主要在于,在其前面加上了一行("Warning message:"
),并且其状态被认为是有问题的。

杂项:由于示例检查和警告通常被视为“错误”,因此在试图将程序包上载到CRAN时,随意使用该功能可能会无意中触发心碎。
停()
最后但并非最不重要的是,我们有stop()
。通过完全取消手头的任务并将控制权交还给用户,可以将警告提高到一个新的水平。此外,它具有最严重的前缀,"Error:"
并添加了术语。

message()
也暗示了一个“消息”,这就是suppressMessages()
捕获的内容。suppressMessages()
不要抑制纯stderr输出,例如suppressMessages(cat("hello\n", file=stderr()))
仍然显示hello
在控制台中。