que - como usar r studio
¿Es posible mostrar mensajes de consola(escritos con `message`) en una interfaz de usuario brillante? (2)
(Publicación cruzada desde el brillante grupo de Google desde que obtuve 0 respuestas).
No entiendo el mensaje de R vs cat vs print vs etc. con demasiada profundidad, pero me pregunto si es posible capturar mensajes y ¿quiénes son ellos en una aplicación brillante?
Ejemplo: la siguiente aplicación puede capturar sentencias cat (e imprimir sentencias también) pero no sentencias de mensajes
runApp(shinyApp(
ui = fluidPage(
textOutput("test")
),
server = function(input,output, session) {
output$test <- renderPrint({
cat("test cat")
message("test message")
})
}
))
Enlace a la pregunta original: https://groups.google.com/forum/#!topic/shiny-discuss/UCacIquFJQY
Gracias
Sé que esto no es tan elegante, pero capture.output
un problema similar con capture.output
; Lamentablemente, sink
no permite la captura simultánea de mensajes y la salida . No los obtiene en el orden original, pero puede extraer ambas secuencias al menos (aquí se convierte a 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>")
)})
})
)
Salida:
test message
test message2
test cat
test cat2
Quizás en el caso de que el usuario quiera capturar ambos, pero también los separe, esto proporcionará una solución práctica. (El paquete de shinyjs
parece estar limpio, ¡hay que echarle un vistazo!)
Yihui sugirió que lo use con withCallingHandlers
, y eso de hecho me permitió una solución. No estaba muy seguro de cómo usar esa función de una manera que hiciera exactamente lo que necesitaba porque mi problema era que tenía una función que imprimía varios mensajes de uno en uno y que utilizaba un enfoque ingenuo solo imprimía el último mensaje. Aquí está mi primer intento (que funciona si solo tienes un mensaje para mostrar):
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)
)
})
}
))
Observe cómo solo se emite two/n
. Así que mi solución final fue usar la función html
del paquete shinyjs
(descargo de responsabilidad: escribí ese paquete), que me permite cambiar o agregar al HTML dentro de un elemento. Funcionó perfectamente, ahora ambos mensajes se imprimieron en tiempo real.
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)
})
})
}
))