2017-09-21 1 views
2

Ich habe eine Shiny-App, die eine Reihe von Dropdown-Auswahlfelder enthält, deren Werte aus dem Lesen einer RDS-Datei gefüllt werden. Die App enthält auch eine fileInput-Funktion zum Hochladen neuer Daten. Wie kann ich die Werte in den Dropdown-Feldern ändern, um die neuen Daten widerzuspiegeln? Momentan kann ich sehen, dass die Daten hochgeladen werden, aber die alten Daten bleiben im Dropdown-Menü.Update Shiny 'selectInput' Drop-Down mit neuen Werten nach dem Hochladen neuer Daten mit fileInput

Die Daten, die in einer Datei

saveRDS(data.frame(names=c("Jill","Jane","Megan")),"myDataFrame.rds") 

In meiner app.R Datei gespeichert werden hochgeladen sollte ich die ‚default‘ Wert der Daten zuerst definieren:

myDataFrame <- data.frame(names=c("Tom","Dick","Harry")) 

Die Inhalt meiner app.R ist wie folgt:

library(shiny) 
ui <- shinyUI(
fluidPage(
    fileInput('file1', 'Choose file to upload',accept = ".rds"), 
    selectInput("myNames","Names",myDataFrame$names), 
    tableOutput('contents') 
) 
) 

server <- shinyServer(function(input, output) { 
    output$contents <- renderTable({ 
    inFile <- input$file1 
    if (is.null(inFile)) { return(myDataFrame) } 
    readRDS(inFile$datapath) 
    }) 
    }) 

die erste Ansicht der Anwendung a s erwartet: Sowohl das Dropdown als auch die Tabelle enthalten die 'Standardnamen'. Nach dem Hochladen meiner RDS-Datei, die einen neuen Datenrahmen enthält, ändert sich die Tabelle (nach der ich gesucht habe), aber die Dropdown-Werte nicht. Wie kann ich das letztere geschehen lassen?

Antwort

1

Ich habe reaktives Objekt myData, die Sie für die Tabelle verwenden, haben contents, aber noch wichtigen Entscheidungen in selectInput zu aktualisieren (überprüfen observe und updateSelectInput Teil).

library(shiny) 

ui <- shinyUI(
    fluidPage(
     fileInput("file1", "Choose file to upload", accept = ".rds"), 
     selectInput("myNames","Names", ""), 
     tableOutput("contents") 
    ) 
) 

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

    myData <- reactive({ 
     inFile <- input$file1 
     if (is.null(inFile)) { 
      d <- myDataFrame 
     } else { 
      d <- readRDS(inFile$datapath) 
     } 
     d 
    }) 

    output$contents <- renderTable({ 
     myData() 
    }) 

    observe({ 
     updateSelectInput(session, "myNames", 
          label = "myNames", 
          choices = myData()$names, 
          selected = myData()$names[1]) 
    }) 

} 

shinyApp(ui, server) 
+0

Nein (t noch) nicht. Das Dropdown wird nun mit den Zahlen 1, 2 und 3 gefüllt - sowohl vor als auch nach dem Hochladen der Datei. – janverkade

+0

@janverkade Sie verwenden genauen Code und gleichen 'myDataFrame'? Hast du data.frames geändert? Ich stelle mir vor, dass Zeilennummern etwas damit zu tun haben. – PoGibas

+0

Ja - Kopieren Sie Ihren Code in meine App.R. – janverkade

0

off Antwort von @PoGibas zu Riff, ich brauchte mehrere Listenwerte für eine App zu laden, ist hier eine ähnliche Anwendung reactiveValues und observeEvent mit:

library(shiny) 

# save a dummy RDS for loading 
saveRDS(list(names=LETTERS,numbers=seq(10)),'dummy.rds') 
# define initial values 
myDataList <- list(names=c("Tom","Dick","Harry"), numbers=seq(5)) 

ui <- shinyUI(
    fluidPage(
    fileInput("file1", "Choose file to upload", accept = ".rds"), 
    selectInput("myNames","Names", ""), 
    selectInput("myNumbers","Numbers", ""), 
    tableOutput("contents") 
) 
) 

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

    md <- reactiveValues(
    names = myDataList$names, 
    numbers = myDataList$numbers 
) 

    observeEvent(input$file1,{ 
     d <- readRDS(input$file1$datapath) 
     for (n in names(d)){ 
     md[[n]] <- d[[n]] 
     } 
    }) 

    output$contents <- renderTable({ 
    data.frame(data = c(md$names,md$numbers)) 
    }) 

    observe({ 
    updateSelectInput(session, "myNames", 
         label = "myNames", 
         choices = md$names, 
         selected = md$names[1]) 
    updateSelectInput(session, "myNumbers", 
         label = "myNumbers", 
         choices = md$numbers, 
         selected = md$numbers[1]) 
    }) 
} 

shinyApp(ui, server) 
Verwandte Themen