2016-08-10 6 views
0

Ich habe eine einfache Anwendung, wo ein Benutzer den Namen eines Spielers wählt aus einem selectInput (player_name) Dropdown-Liste und dann können Sie andere Filter von selectInputs (season) und Radiobuttons wählen (contested) die eine Tabelle anzeigt. Ist der Wert player_name nicht geändert worden, ohne dass eine Senden- oder Aktionsschaltfläche verwendet wurde, wodurch die Werte season und contested auf ihre Standardwerte zurückgesetzt werden? Normalerweise würde ich ein conditionalPanel für Eingabeänderungen verwenden, aber in dieser Situation hat player_name Tausende von Spielern.Shiny R: Reset andere Werte eingegeben wird, wenn selectInput Wert ändert

Antwort

0

Die basische Lösung hierfür ist eine zusätzliche uiOutput „filters_UI“ zu verwenden, um die zweite selectInput und Radiobuttons zu setzen und auch input$player_name, um es hinzuzufügen, so zu jeder Zeit, dass die Spielernamen ändert, wird der komplette uiOutput wieder mit dem erstellt werden Anfangswerte. Siehe das Beispiel unten.

library(shiny) 

ui <- fluidPage(
    fluidRow(
    column(6, uiOutput('controls_UI')), 
    column(6, DT::dataTableOutput("table_DT")) 
) 
) 

server <- shinyServer(function(input, output, session) { 
    # to simulate players 
    dat <- USJudgeRatings 
    players <- row.names(dat) 
    seasons <- names(dat) 

    output$controls_UI <- renderUI({ 
    fluidRow(
     column(6, 
     selectInput("player_name", "Players", players, selected = players[1]) 
    ), 
     column(6, 
     uiOutput("filters_UI")) 
    ) 
    }) 

    # render again if input$player_name changes 
    output$filters_UI <- renderUI({ 
    input$player_name 
    fluidRow(
     column(6, 
     selectInput("season", "Season", seasons, selected = seasons[1]) 
    ), 
     column(6, 
     radioButtons("contested", label = "Contested", 
      choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3), 
      selected = 1) 
    ) 
    ) 
    }) 

    output$table_DT <- DT::renderDataTable(
    datR(), 
    options = list(
     scrollX = TRUE, 
     paging = TRUE, 
     lengthMenu = c(10, 20, 50) 
    ), 
    selection = "single", 
    rownames = TRUE 
) 

    # creates a table based on the sliders and radio buttons 
    datR <- reactive({ 
    input$player_name 
    varName <- input$season 
    contested <- ifelse(is.null(input$contested),1,as.integer(input$contested)) 
    dat0 <- data.frame(dat[sample(2:length(players),contested*3), varName]) 
    names(dat0) <- varName 
    dat0 
    }) 

}) 

shinyApp(ui, server) 

Ich hoffe, es könnte Ihnen helfen.

Verwandte Themen