可以在闪亮的 ui 中显示控制台消息(用 `message` 编写)吗?
Possible to show console messages (written with `message`) in a shiny ui?
我不太了解 R 的消息、猫、打印等等,但我想知道是否可以捕获消息并在闪亮的应用程序中显示它们?
示例:以下应用可以捕获 cat 语句(以及打印语句)但不能捕获 message 语句
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
,这确实让我找到了解决方案。我不太确定如何以一种完全符合我需要的方式使用该函数,因为我的问题是我有一个函数一次打印出多条消息,而使用天真的方法只打印最后一条消息。这是我的第一次尝试(如果您只有一条消息要显示,它会起作用):
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)
})
})
}
))
我知道这不是那么优雅,但我使用 capture.output
解决了一个类似的问题;遗憾的是 sink
不允许同时捕获 messages 和 output。你没有按原来的顺序得到它们,但你至少可以提取两个流(这里转向HTML):
runApp(shinyApp(
ui = fluidPage(
uiOutput("test")
),
server = function(input,output, session) {
output$test <- renderUI({
HTML(
paste(capture.output(type = "message", expr = {
message(capture.output(type = "output", expr = {
cat("test cat<br>")
message("test message")
cat("test cat2<br>")
message("test message2")
}))
}), collapse="<br>")
)})
})
)
输出:
test message
test message2
test cat
test cat2
也许在用户想要捕获两者但又想将它们分开的情况下,这将提供一个方便的解决方法。 (你的shinyjs
包裹看起来很整洁,需要看一看!)
我不太了解 R 的消息、猫、打印等等,但我想知道是否可以捕获消息并在闪亮的应用程序中显示它们?
示例:以下应用可以捕获 cat 语句(以及打印语句)但不能捕获 message 语句
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
,这确实让我找到了解决方案。我不太确定如何以一种完全符合我需要的方式使用该函数,因为我的问题是我有一个函数一次打印出多条消息,而使用天真的方法只打印最后一条消息。这是我的第一次尝试(如果您只有一条消息要显示,它会起作用):
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)
})
})
}
))
我知道这不是那么优雅,但我使用 capture.output
解决了一个类似的问题;遗憾的是 sink
不允许同时捕获 messages 和 output。你没有按原来的顺序得到它们,但你至少可以提取两个流(这里转向HTML):
runApp(shinyApp(
ui = fluidPage(
uiOutput("test")
),
server = function(input,output, session) {
output$test <- renderUI({
HTML(
paste(capture.output(type = "message", expr = {
message(capture.output(type = "output", expr = {
cat("test cat<br>")
message("test message")
cat("test cat2<br>")
message("test message2")
}))
}), collapse="<br>")
)})
})
)
输出:
test message
test message2
test cat
test cat2
也许在用户想要捕获两者但又想将它们分开的情况下,这将提供一个方便的解决方法。 (你的shinyjs
包裹看起来很整洁,需要看一看!)