2015-05-27 11 views
19

(Bài đăng chéo từ nhóm Google thảo luận sáng bóng kể từ khi tôi nhận được 0 câu trả lời).Có thể hiển thị thông báo bàn điều khiển (được viết bằng `tin nhắn`) trong ui sáng bóng?

Tôi không hiểu thông điệp của R so với mèo vs in so với v.v. quá sâu, nhưng tôi tự hỏi liệu có thể thu thập tin nhắn và họ trong ứng dụng sáng bóng không?

Ví dụ: ứng dụng sau đây có thể nắm bắt được báo cáo mèo (và báo cáo in cũng) nhưng không báo cáo thông điệp

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

liên kết cho câu hỏi ban đầu: https://groups.google.com/forum/#!topic/shiny-discuss/UCacIquFJQY

Cảm ơn

+2

Tôi đoán bạn có thể sử dụng 'withCallingHandlers()' để nắm bắt thư trong biểu thức R, sau đó in/cat chúng. –

+0

Cảm ơn Yihui, tôi đã có thể sử dụng nó, đó là một sự trợ giúp rất lớn –

Trả lời

24

Yihui đề nghị tôi sử dụng withCallingHandlers, và điều đó thực sự cho tôi một giải pháp. Tôi không hoàn toàn chắc chắn về cách sử dụng chức năng đó theo cách sẽ làm chính xác những gì tôi cần bởi vì vấn đề của tôi là tôi có một chức năng in từng thư một và sử dụng cách tiếp cận ngây thơ chỉ in thông điệp cuối cùng. Đây là nỗ lực đầu tiên của tôi (mà hoạt động nếu bạn chỉ có một thông điệp để hiển thị):

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) 
    ) 
    }) 
    } 
)) 

Thông báo như thế nào chỉ two\n được outputted. Vì vậy, giải pháp cuối cùng của tôi là sử dụng hàm html từ gói shinyjs (tuyên bố từ chối trách nhiệm: Tôi đã viết gói đó), cho phép tôi thay đổi hoặc nối thêm vào HTML bên trong một phần tử. Nó hoạt động hoàn hảo - bây giờ cả hai tin nhắn đã được in ra trong thời gian thực.

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) 
     }) 
    }) 
    } 
)) 
+0

Tôi tip mũ của tôi cho bạn, thưa bạn. – geotheory

+0

Cảm ơn bạn rất nhiều. Tôi đã có một chức năng in văn bản message(). Với giải pháp của bạn, tôi có thể chỉnh sửa dòng 'shinyjs :: html (id =" text ", html ...' sử dụng thẻ HTML. – Facottons

0

Tôi biết điều này không phải là gần như thanh lịch, nhưng tôi đã làm việc xung quanh một vấn đề tương tự bit sử dụng capture.output; đáng buồn là sink không cho phép chụp đồng thời tin nhắn s và đầu ra. Bạn không nhận được chúng theo thứ tự ban đầu, nhưng bạn có thể trích xuất tất cả các dòng ít nhất (ở đây quay sang 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>") 
)}) 
}) 
) 

Output:

test message 
test message2 
test cat 
test cat2 

Có lẽ trong trường hợp nếu người dùng muốn nắm bắt cả hai mà còn tách chúng ra, điều này sẽ cung cấp một công việc hữu ích xung quanh. (Gói shinyjs của bạn có vẻ gọn gàng, cần phải xem xét!)

+2

Vấn đề với cách tiếp cận này là tất cả đầu ra được in ở cuối, nó không Vì vậy, nếu bạn chạy một chức năng chậm mà in đầu ra khi nó chạy, bạn sẽ không thấy nó cho đến khi nó được thực hiện –

Các vấn đề liên quan