2017-07-16 58 views
2

我試圖創建一個簡單的應用程序使用這些功能:嵌套活性表達的閃亮

用戶會選擇「自定義」或「默認」。

如果選擇「默認」,將顯示默認文本。但是,如果選擇「自定義」,用戶將能夠「提交」文本並顯示提交的文本。

我已經寫了一些代碼來做到這一點,但無法在「自定義」情況下同時處理兩個反應式表達式。

下面是代碼:

library(shiny) 

ui = navbarPage(

title = 'Text', 

tabPanel(

'Custom App', 

fluidRow(


    radioButtons('radio', 'Select Action', choices = list('Default' = 'Default', 'Custom' = 'Custom'), 

       selected = 'Default', inline = T), 

    column(6, textInput('text_given', label = 'Enter Text', value = '')), 

    actionButton('submit_button', 'Submit'), 

    textOutput(text) 

) 

) 

) 

server = function(input, output, session){ 

main = reactive({ 

selected_action = input$radio 

    if(selected_action == 'Default'){ 

    text_to_show = 'Default Text' 

    } else{ 

    dataInput = eventReactive(input$submit_button,{ 

     text_to_show = input$text_given 

    }) 

} 

return(list('text_output' = text_to_show)) 

}) 

output$text = renderText(main()$text_output) 

} 

shinyApp(ui = ui, server = server) 

回答

1

沒有必要窩您reactives。您應該在反應式之外創建您的反應式表達式,並從反應式中引用該對象。我相信這是做你想做的,讓我知道如果這有幫助!

library(shiny) 

ui = navbarPage(

    title = 'Text', 

    tabPanel(

    'Custom App', 

    fluidRow(
     radioButtons('radio', 'Select Action', choices = list('Default' = 'Default', 'Custom' = 'Custom'), 
        selected = 'Default', inline = T), 
    column(6, textInput('text_given', label = 'Enter Text', value = '')), 
     actionButton('submit_button', 'Submit'), 
     textOutput("text") 

    ) 

) 

) 

server = function(input, output, session){ 

    submitted_text <- eventReactive(input$submit_button, 
       { 
        input$text_given 
       }) 

    main = reactive({ 
    selected_action = input$radio 
    if(selected_action == 'Default'){ 
     text_to_show = 'Default Text' 
    } 
    else 
    { 
     text_to_show = submitted_text() 
    } 
    return(text_to_show) 
    }) 

    output$text = renderText(main()) 

} 

shinyApp(ui = ui, server = server) 

編輯:基於評論

library(shiny) 
library(shinyjs) 

ui = navbarPage(

    title = 'Text', 

    tabPanel(

    'Custom App', 
    useShinyjs(), 
    fluidRow(
     radioButtons('radio', 'Select Action', choices = list('Default' = 'Default', 'Custom' = 'Custom'), 
        selected = 'Default', inline = T), 
     column(6, shinyjs::hidden(textInput('text_given', label = 'Enter Text', value = ''))), 
     shinyjs::hidden(actionButton('submit_button', 'Submit')), 
     textOutput("text") 

    ) 

) 

) 

server = function(input, output, session){ 

    submitted_text <- eventReactive(input$submit_button, 
            { 
            input$text_given 
            }) 

    observeEvent(input$radio, 
       { 
       if(input$radio=='Default') 
       { 
        hide("text_given") 
        hide("submit_button") 
       } 
       else 
       { 
        show("text_given") 
        show("submit_button") 
       } 

       }) 

    main = reactive({ 
    selected_action = input$radio 
    if(selected_action == 'Default'){ 
     text_to_show = 'Default Text' 
    } 
    else 
    { 
     text_to_show = submitted_text() 
    } 
    return(text_to_show) 
    }) 

    output$text = renderText(main()) 

} 

shinyApp(ui = ui, server = server) 
+0

這完美的作品。謝謝 !你可以幫助做到這一點。我想在選擇默認值時隱藏文本字段並提交按鈕,並且只在選擇自定義時才顯示它。這個怎麼做 ? –

+0

沒問題,看我的編輯。希望這可以幫助! – Florian

+0

非常感謝!這很好。只有一個小問題是,如果我選擇自定義,輸入文本並提交,轉到默認,然後回到自定義,上一個輸入的文本仍然存在。如果在點擊提交後消失,那將會很棒。感謝您的幫助。 –