我不太理解R的消息、cat 、打印等等,但我想知道是否有可能捕获消息并在一个shiny 的应用程序中显示它们?

示例:以下应用程序可以捕获cat语句(以及打印语句),但不能捕获消息语句

runApp(shinyApp(
  ui = fluidPage(
    textOutput("test")
  ),
  server = function(input,output, session) {
    output$test <- renderPrint({
      cat("test cat")
      message("test message")
    })
  }
))

Cross post from the shiny-discuss Google group since I got 0 answers.

推荐答案

一辉建议我使用withCallingHandlers,这确实让我找到了一个解决方案.我不太确定如何使用该函数来实现我所需要的功能,因为我的问题是,我有一个函数,它一次打印出几条消息,而使用一种简单的方法,只打印最后一条消息.以下是我的第一次try (如果您只有一条消息要显示,那么这一try 就有效):

foo <- function() {
  message("one")
  message("two")
}

runApp(shinyApp(
  ui = fluidPage(
    actionButton("btn","Click me"),
    textOutput("text")
  ),
  server = function(input,output, session) {
    observeEvent(input$btn, {
      withCallingHandlers(
        foo(),
        message = function(m) output$text <- renderPrint(m$message)
      )
    })
  }
))

注意,只有two\n个被输出.因此,我的最终解决方案是使用shinyjs包中的html函数(免责声明:我编写了该包),它允许我更改或附加到元素中的HTML.它工作得很好——现在两条信息都被实时打印出来了.

foo <- function() {
  message("one")
  Sys.sleep(0.5)
  message("two")
}

runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    actionButton("btn","Click me"),
    textOutput("text")
  ),
  server = function(input,output, session) {
    observeEvent(input$btn, {
      withCallingHandlers({
        shinyjs::html("text", "")
        foo()
      },
        message = function(m) {
          shinyjs::html(id = "text", html = m$message, add = TRUE)
      })
    })
  }
))

R相关问答推荐

如何按包含特殊符号 R 的名称对列进行排序

在 tibble R 的截止范围内随机采样

如果在订单中匹配代码之前删除行

如何从R中的字符串中删除一定长度的数字模式

VS Code中不在全局环境中的R对象

在嵌套列表中从第一个列表中选择第一个元素,从第二个列表中选择第二个元素,依此类推

如何在两个不同的数据帧上运行 cor.test()

从R中的数字字符串创建单个数字的列总计

使用 ggplot2 创建一个中心 y 轴图,左右两侧有两个 x 轴

expss表输出的rbinding表错误

如果向量之间有公共元素/没有公共元素,则返回 TRUE/FALSE

返回 R 中的第 90 个百分位值

调用堆栈的稳定性如何,特别是 -1?

R Plotly Bar Chart - 添加水平线标记

在R中从宽到长reshape 数据框

Ubuntu 22.04 中 R impish repo 的问题 - impish-cran40

在 group_by 中,改变一个新列,该列根据列的出现顺序获取列的值

网络元素名称的几种组合的正则表达式

如何清理包含混合变量的列,例如 char 格式的当前、空白、R 中的字符串

将数据框列表合并为一个数据框并一步汇总