This question is inspired by this post where printouts from a called functions are displayed inside a shiny app when the code is running.
My question is basically, what is the difference between:
message('hello')
#and
sink(file=stderr())
cat('hello')
In the documentation for message it says that:
The default handler sends the message to the stderr() connection.
I haven't found a way to illustrate the difference in just R without shiny , but in this example the 2 functions behave differently
library(shiny)
library(shinyjs)
myPeriodicFunction1 <- function(){
  for(i in 1:5){
    msg <- paste(sprintf("[1] Step %d done.... \n",i))
    message(msg)
    Sys.sleep(1)
  }
}
myPeriodicFunction2 <- function(){
  for(i in 1:5){
    msg <- paste(sprintf("[2] Step %d done.... \n",i))
    cat(msg)
    Sys.sleep(1)
  }
}
runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    actionButton("btn1","Message"),
    actionButton("btn2","Sink to stderr"),
    textOutput("text")
  ),
  server = function(input,output, session) {
    observeEvent(input$btn1, {
      withCallingHandlers({
        shinyjs::text("text", "")
        myPeriodicFunction1()
      },
      message = function(m) {
        shinyjs::text(id = "text", text = m$message, add = FALSE)
      })
    })
    observeEvent(input$btn2, {
      withCallingHandlers({
        shinyjs::text("text", "")
        sink(file=stderr())
        myPeriodicFunction2()
        sink()
      },
      message = function(m) {
        shinyjs::text(id = "text", text = m$message, add = FALSE)
      })
    })
  }
))
Can anyone help me straighten this out?