2016-08-14 3 views
2

ボタンをクリックしたときにuiOutput()plotOutput()を使用してUIを変更したい。イベントを待たずにすぐにコンテンツを変更すると、すべてうまく動作します。ボタンをクリックしたときにoutput$body.immediatelyと同じ出力を持つoutput$body.on.buttonに変更する必要はありますか?R Shiny:eventReactive()内で出力関数が機能しない

server.R:

shinyServer(function(input, output, session) { 

    output$plot <- renderPlot({plot(1:5)}) 
    output$body.ui <- renderUI({tags$p('This works only within renderUI')}) 

    output$body.on.button <- eventReactive(input$goButton, { 
    switch(
     input$select, 
     "text" = 'This works within both functions', 
     "ui" = uiOutput("body.ui"), # This doesn't work 
     "plot" = plotOutput("plot") # This doesn't work 
    ) 
    }) 

    output$body.immediately <- renderUI({ 
    switch(
     input$select, 
     "text" = 'This works within both functions', 
     "ui" = uiOutput("body.ui"), # This works 
     "plot" = plotOutput("plot") # This works 
    ) 
    }) 
}) 

ui.R:

library(markdown) 

shinyUI(
    navbarPage(
    "Title", 

    tabPanel(
     "First element", 
     fluidRow(

     column(
      4, 
      wellPanel(
      selectInput("select", "Select", c('text', 'ui', 'plot')), 
      actionButton("goButton", "Go!") 
     ) # end of wellPanel 
     ), # end of column 

     column(
      4, 
      uiOutput("body.immediately") 
     ), # end of column 

     column(
      4, 
      uiOutput("body.on.button") 
     ) # end of column 


    ) # end of fluidROw 
    ) # end of tabPanel 
) # end of navbarPage 
) # end of shinyUI 

私はまた、機能observeEvent()を試してみましたが、それは助けにはなりませんでした。

答えて

3

同じIDを持つ2つの出力を持つことができないため、機能しません。あなたの例では、 "テキスト"は単なるテキストなので動作します - IDを持つ出力ではありません。

以下の例では、固有のIDを持つ3つの新しい出力を追加しました。 uiOutput body.on.buttonは、ボタンをクリックした後も特定の出力を動的に受信します。


あなたはこの三行

output$text2 <- renderText({ 'This works within both functions' }) 
output$body.ui2 <- renderUI({tags$p('This works only within renderUI')}) 
output$plot2 <- renderPlot({plot(1:10)}) 

を削除してから、「テキスト」(同様に、他の2つと)を参照するために、「テキスト2」からeventReactive内IDsを変更しようとすることができるクリックした後に出力ボタン上には表示されません。

たとえば、2つの同じプロットが必要な場合は、一意のIDを持つ2つのplotOutputsを作成し、同じプロットを生成する2つのrenderPlot関数を使用する必要があります。

こちらがお役に立てば幸いです。


全例:

server <- shinyServer(function(input, output, session) { 

    # Create outputs with unique ID 

    output$text <- renderText({ 'This works within both functions' }) 
    output$body.ui <- renderUI({tags$p('This works only within renderUI')}) 
    output$plot <- renderPlot({plot(1:5)}) 

    output$text2 <- renderText({ 'This works within both functions' }) 
    output$body.ui2 <- renderUI({tags$p('This works only within renderUI')}) 
    output$plot2 <- renderPlot({plot(1:10)}) 


    # Save the selected type of the output and then pass it to renderUI via react() 
    react <- eventReactive(input$goButton, { 
    switch(
     input$select, 
     "text" = textOutput("text2"), 
     "ui" = uiOutput("body.ui2"), 
     "plot" = plotOutput("plot2") 
    ) 
    }) 

    output$body.on.button <- renderUI({ 
    react() 
    }) 

    output$body.immediately <- renderUI({ 
    switch(
     input$select, 
     "text" = textOutput("text"), 
     "ui" = uiOutput("body.ui"), # This works 
     "plot" = plotOutput("plot") # This works 
    ) 
    }) 
}) 


    library(markdown) 


ui <-shinyUI(
    navbarPage(
    "Title", 

    tabPanel(
     "First element", 
     fluidRow(

     column(
      4, 
      wellPanel(
      selectInput("select", "Select", c('text', 'ui', 'plot')), 
      actionButton("goButton", "Go!") 
     ) # end of wellPanel 
     ), # end of column 

     column(
      4, 
      uiOutput("body.immediately") 
     ), # end of column 

     column(
      4, 
      uiOutput("body.on.button") 
     ) # end of column 


    ) # end of fluidROw 
    ) # end of tabPanel 
) # end of navbarPage 
) # end of shinyUI 
shinyApp(ui, server) 
+1

ありがとう!二重性は意図的に機能することを確認するために作成されました(ただし、余分な問題を引き起こす可能性はありません)。この解決策は 'renderUI()'関数内にあります。それは今正常に動作します –

関連する問題