2017-07-16 20 views
2

これらの機能を備えた単純なアプリケーションを作成しようとしています。Shinyのネストされた反応式

ユーザーは「カスタム」または「デフォルト」を選択します。

[デフォルト]を選択すると、デフォルトのテキストが表示されます。しかし、「カスタム」を選択すると、ユーザーはテキストを「提出」することができ、送信されたテキストが表示されます。

私はこれを行うためのコードを書いていますが、「カスタム」のケースでは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

巣あなたの反応性物質への必要はありませんが。あなたはreactiveの外にあなたのreactiveExpressionを作成し、あなたの反応の中からそのオブジェクトを参照する必要があります。私はこれがあなたの望むことを信じています、もしこれが助けてくれたら教えてください!

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) 

EDIT:コメント

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

ありがとう!これは素晴らしいです。ちょっとした問題は、カスタムを選択してテキストを入力してサブミットし、デフォルトに戻ってからカスタムに戻ったときに、前に入力したテキストが残ることです。提出がクリックされた後にそれが消えれば素晴らしいだろう。助けてくれてありがとう。 –

関連する問題