TL; DR
Debería utilizarlo cat()al crear print.*()funciones para objetos S3. Para todo lo demás, debe usar a message()menos que el estado del programa sea problemático. p. ej., error incorrecto que es recuperable da warning()vs. mostrar usos de error de detención stop().
Objetivo
El objetivo de esta publicación es proporcionar comentarios sobre las diferentes opciones de salida a las que tiene acceso un desarrollador de paquetes y cómo se debe estructurar la salida que está potencialmente en un nuevo objeto o basada en cadenas.
Descripción general de la salida R
Las funciones de salida tradicionales son:
print()
cat()
message()
warning()
stop()
Ahora, las dos primeras funciones ( print()y cat()) envían su salida a stdoutla salida estándar. Las tres últimas funciones ( message(), warning()y stop()) envían su producción a stderro el error estándar. Es decir, la salida del resultado de un comando como lm()se envía a un archivo y la salida de error, si existe, se envía a un archivo completamente separado. Esto es particularmente importante para la experiencia del usuario, ya que los diagnósticos no saturan la salida de los resultados en archivos de registro y los errores están disponibles para buscar rápidamente.
Diseño para usuarios y paquetes externos
Ahora, lo anterior se enmarca más en una mentalidad de E / S y no necesariamente en un conjunto de marcos orientado al usuario. Entonces, proporcionemos algo de motivación para ello en el contexto de un usuario de R cotidiano. En particular, al usar 3-5 o las stderrfunciones, su salida se puede suprimir sin modificar el texto de la consola a través de sink()o capture.output(). La supresión normalmente viene en forma de suppressWarnings(), suppressMessages(), suppressPackageStartupMessages(), y así sucesivamente. Por lo tanto, los usuarios solo se enfrentan a la salida orientada a resultados. Esto es particularmente importante si planea permitir a los usuarios la flexibilidad de desactivar la salida basada en texto al crear documentos dinámicos a través de knitr , rmarkdown o Sweave .
En particular, knitrofrece opciones trozo tales como error = F, message = F, y warning = F. Esto permite la reducción del texto que acompaña a un comando en el documento. Además, esto evita la necesidad de usar la results = "hide"opción que deshabilitaría todas las salidas.
Detalles de la salida
impresión()
Primero, tenemos un viejo pero bueno, print(). Esta función tiene algunas limitaciones importantes. Uno de ellos es la falta de concatenación de términos incorporada. El segundo, y probablemente más grave, es el hecho de que cada salida va precedida [x]de citas en torno al contenido real. En xeste caso, se refiere al número de elemento que se está imprimiendo. Esto es útil para propósitos de depuración, pero fuera de eso no sirve para nada.
p.ej
print("Hello!")
[1] "Hello!"
Para la concatenación, confiamos en que la paste()función funcione en sincronía con print():
print(paste("Hello","World!"))
[1] "Hello World!"
Alternativamente, se puede usar la paste0(...)función en lugar de paste(...)para evitar el uso predeterminado de spaceentre elementos gobernados por paste()el sep = " "parámetro de. (también conocido como concatenación sin espacios)
p.ej
print(paste0("Hello","World!"))
[1] "HelloWorld!"
print(paste("Hello","World!", sep = ""))
[1] "HelloWorld!"
gato()
Por otro lado, cat()aborda todas estas críticas. Lo más notable es que el sep=" "parámetro de la paste()funcionalidad está integrado, lo que permite omitir la escritura paste()dentro cat(). Sin embargo, el cat()único inconveniente de la función es que tienes que forzar nuevas líneas a través del \napéndice al final o fill = TRUE(usa el ancho de impresión predeterminado).
p.ej
cat("Hello!\n")
Hello!
cat("Hello","World!\n")
Hello World!
cat("Hello","World!\n", sep = "")
HelloWorld!
Es por esta misma razón por la que debe utilizarlo cat()al diseñar un print.*()método S3.
mensaje()
¡La message()función es un paso mejor que incluso cat()! La razón por la que la salida es distinta del texto sin formato tradicional al que se dirige en stderrlugar de stdout. Por ejemplo, cambiaron el color de salida en negro estándar a salida en rojo para llamar la atención de los usuarios.

Además, tiene la paste0()funcionalidad incorporada.
message("Hello ","World!")
"Hello World!"
Además, message()proporciona un estado de error que se puede utilizar contryCatch()
p.ej
tryCatch(message("hello\n"), message=function(e){cat("goodbye\n")})
goodbye
advertencia()
La warning()función no es algo para usar de forma casual. La función de advertencia se diferencia de la función de mensaje principalmente por tener una línea prefijada ( "Warning message:") y su estado se considera problemático.

Misc: El uso casual de una función puede desencadenar inadvertidamente una angustia al intentar cargar el paquete en CRAN debido a que las comprobaciones y advertencias de ejemplo normalmente se tratan como "errores".
detener()
Por último, pero no menos importante, tenemos stop(). Esto lleva las advertencias al siguiente nivel al eliminar por completo la tarea en cuestión y devolver el control al usuario. Además, tiene el prefijo más serio con el término "Error:"agregado.

message()también señala un "mensaje", que es lo quesuppressMessages()capta.suppressMessages()no suprima la salida stderr pura, por ejemplo,suppressMessages(cat("hello\n", file=stderr()))todavía se muestrahelloen la consola.