2016-12-31 63 views
4

如何让renderUI对用户从下拉列表中选择不同的值做出反应,而无需单击我的submitButton?闪亮:让renderUI对下拉列表做出反应not submitButton

我有一个包含3件事情wellPanel:
1)我的下拉列表
2)一套动态输入(通过我的renderUI函数创建,取决于选择的#1)
3 )submitButton

期望的行为:对下拉选择的更改为用户提供了不同的输入小部件。当他们准备好所选输入的结果时,他们点击submitButton,并在mainPanel中获得结果。

问题:我的renderUI只对单击submitButton后的下拉选择作出反应。据我所知,我需要隔离一些东西或使用observeEvent,但我一直无法弄清楚。

简单的例子:

rm(list = ls()) 
library(shiny) 

ui <- fluidPage(
    fluidRow(
column(4,wellPanel(
    selectInput("analysis", label = "Type of Analysis:", 
       c("Award Total" = "total", 
       "Award Average" = "average"), 
       width = validateCssUnit("70%")), 
    uiOutput("filter_box"), 
    submitButton() 
    )), 
column(8, textOutput("sample_text")) 
) 
) 

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

    output$filter_box <- renderUI({ 
if(input$analysis == "total"){ 
    tagList(radioButtons(inputId = "input1", label = "Select One:",c("A", "B", "C"), selected = "A")) 
} else { 
    tagList(checkboxGroupInput(inputId = "input2", label = "Select all that apply:",c("1","2","3","4","5")), 
      dateRangeInput(inputId = "input3", label = "Enter Date Range")) 
} 
}) 

output$sample_text <- renderText({ 
    if(input$analysis == "total"){ 
    input$input1 
    } else if(input$analysis == "average") { 
    c(input$input2, input$input3) 
    } 
}) 
} 

runApp(list(ui = ui, server = server)) 
+3

您不需要使用submitButton,而是使用actionButton。 submitButtons是可怕的(闪亮的作者自己推荐它),因为它们导致了奇怪的反应行为。对不起,我不会给你一个解决方案,我只是建议你使用actionButton,而这个问题不会发生,那么 –

回答

5

您需要引入两个变化。

  1. 更改submitButtonactionButton(请参阅从@daattali评论)

  2. 隔离renderText,并使其反应到actionButton。

查看下面的代码。

rm(list = ls()) 
library(shiny) 

ui <- fluidPage(
    fluidRow(
    column(4,wellPanel(
     selectInput("analysis", label = "Type of Analysis:", 
        c("Award Total" = "total", 
        "Award Average" = "average"), 
        width = validateCssUnit("70%")), 
     uiOutput("filter_box"), 
     actionButton(inputId = 'button_1',label = 'Apply Changes') 
    )), 
    column(8, textOutput("sample_text")) 
) 
) 

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

    output$filter_box <- renderUI({ 
    if(input$analysis == "total"){ 
     tagList(radioButtons(inputId = "input1", label = "Select One:",c("A", "B", "C"), selected = "A")) 
    } else { 
     tagList(checkboxGroupInput(inputId = "input2", label = "Select all that apply:",c("1","2","3","4","5")), 
       dateRangeInput(inputId = "input3", label = "Enter Date Range")) 
    } 
    }) 

    output$sample_text <- renderText({ 
    input$button_1 
    isolate({ 
     if(input$analysis == "total"){ 
     input$input1 
     } else if(input$analysis == "average") { 
     c(input$input2, input$input3) 
     } 
    }) 

    }) 
} 

runApp(list(ui = ui, server = server)) 
+0

太棒了,谢谢。我很惊讶,我的谷歌搜索没有出现该动作按钮更喜欢提交按钮(谢谢@达瓦利)。还有一个问题:在用于输出@ sample_text的renderText中,我认为输入$ button_1在那里触发反应性,但为什么输入$ button_1的值实际上不会在结果文本中呈现? – twgardner2

+1

渲染什么是renderText()函数返回的内容。在这种情况下,由于没有return()语句,这将是最后执行的语句(这里以if/else为条件)。你可以使用return()来使其更加明确。 –