gpt4 book ai didi

r - 为什么在 R 中 message() 比 print() 更适合编写包?

转载 作者:行者123 更新时间:2023-12-03 01:12:49 25 4
gpt4 key购买 nike

我希望知道为什么message()是比print()更好的选择在打印诊断消息时。

例如,print()函数是打印 R 对象的更好选择,例如 'iris' ,而,message()当我们想要连接字符串时更好,例如message("a", "b")短于 print(paste0("a", "b")) .

但是,我认为比上面列出的那些简单的差异更多。我已阅读这两种方法的文档

  • http://stat.ethz.ch/R-manual/R-devel/library/base/html/message.html ,
  • http://stat.ethz.ch/R-manual/R-devel/library/base/html/print.html

  • 但是,似乎它们不像我希望我的问题那样提供信息。

    如果有人让我们知道在这种情况下,我将不胜感激 message()优于 print() ,以及为什么。

    最佳答案

    TL; 博士

    您应该使用 cat() 制作 print.*() 时S3 对象的函数。对于其他一切,您应该使用 message() 除非程序的状态有问题。例如可恢复的坏错误给出 warning() vs. 显示停止错误使用 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(...) 避免默认使用由 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 .例如他们将颜色从标准黑色输出更改为红色输出以吸引用户的眼球。

    Message Output

    此外,您还拥有内置的 paste0() 功能。
    message("Hello ","World!") # Note the space after Hello
    "Hello World!"

    此外, message() 提供可与 tryCatch() 一起使用的错误状态

    例如
     tryCatch(message("hello\n"), message=function(e){cat("goodbye\n")})
    goodbye

    警告()

    warning() 函数不是随便用的。警告功能与消息功能的区别主要在于它有一行前缀( "Warning message:" ),并且它的状态被认为是有问题的。

    warning output

    其他:在函数中随意使用可能会在尝试将包上传到 CRAN 时无意中触发心碎。由于示例检查和警告通常被视为“错误”。

    停止()

    最后但并非最不重要的是,我们有 stop() .这通过完全终止手头的任务并将控制权交还给用户来将警告提升到一个新的水平。此外,它有最严肃的前缀词 "Error:"。正在添加。

    Error Output

    关于r - 为什么在 R 中 message() 比 print() 更适合编写包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36699272/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com