2015-05-27 12 views
19

(मुझे 0 उत्तरों के बाद चमकदार चर्चा Google समूह से क्रॉस पोस्ट)।एक चमकदार ui में कंसोल संदेश ('संदेश` के साथ लिखा गया) दिखाने के लिए संभव है?

मुझे आर के संदेश बनाम बिल्ली बनाम प्रिंट बनाम इत्यादि बहुत गहराई से समझ में नहीं आता है, लेकिन मुझे आश्चर्य है कि संदेश कैप्चर करना संभव है और उन्हें चमकदार ऐप में कौन सा संभव है?

उदाहरण: निम्नलिखित एप्लिकेशन बिल्ली बयान (और प्रिंट बयान के साथ-साथ) नहीं बल्कि संदेश बयान

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

मूल प्रश्न के लिए लिंक पर कब्जा कर सकते हैं: https://groups.google.com/forum/#!topic/shiny-discuss/UCacIquFJQY

धन्यवाद

+2

मुझे लगता है कि आप आर अभिव्यक्ति में संदेशों को कैप्चर करने के लिए 'कॉलिंग हैंडलर()' का उपयोग कर सकते हैं, फिर उन्हें प्रिंट/बिल्ली दें। –

+0

धन्यवाद यहुई, मैं इसका उपयोग करने में सक्षम था, यह एक बड़ी मदद है –

उत्तर

24

Yihui मैं उपयोग का सुझाव दिया 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 कैसे outputted हो जाता है: यहाँ मेरा पहला प्रयास (जो काम करता है अगर आप केवल दिखाने के लिए एक संदेश है) है। तो मेरा अंतिम समाधान फ़ंक्शन का उपयोग shinyjs पैकेज (अस्वीकरण: मैंने उस पैकेज को लिखा था) का उपयोग करना था, जो मुझे तत्व के अंदर 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) 
     }) 
    }) 
    } 
)) 
+0

मैं आपको अपनी टोपी टिपता हूं, महोदय। – geotheory

+0

बहुत बहुत धन्यवाद। मेरे पास एक ऐसा फ़ंक्शन है जो संदेश() टेक्स्ट मुद्रित करता है। आपके समाधान के साथ मैं 'shinyjs :: html (id = "text", html ...' HTML टैग का उपयोग कर लाइन संपादित कर सकता हूं। – Facottons

0

मैं जानता हूँ कि यह लगभग रूप में सुंदर नहीं है, लेकिन मैं थोड़ा समान समस्या capture.output का उपयोग कर के आसपास काम किया; दुख की बात है sinkसंदेश एस और आउटपुट के साथ-साथ कैप्चर करने की अनुमति नहीं देता है। आप उन्हें मूल आदेश में प्राप्त नहीं है, लेकिन आप कम से कम दोनों धाराओं निकाल सकते हैं (यहाँ एचटीएमएल में बदल गया):

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 पैकेज साफ दिखता है, इसे देखने की आवश्यकता है!)

+2

इस दृष्टिकोण के साथ समस्या यह है कि सभी आउटपुट अंत में मुद्रित हो जाते हैं, यह नहीं होता है लाइव में आओ। इसलिए यदि आप धीमे फ़ंक्शन चलाते हैं जो आउटपुट प्रिंट करता है तो यह चलता है, आप इसे तब तक नहीं देख पाएंगे जब तक यह पूरा नहीं हो जाता है –

संबंधित मुद्दे