2017-09-21 37 views
2

我有一個Shiny應用程序,其中包含一些下拉選擇框,其值從讀取RDS文件中填充。該應用程序還包含一個fileInput函數來上傳新數據。如何更改下拉框中的值以反映新數據?目前我可以看到數據已上傳,但舊數據仍保留在下拉列表中。使用fileInput上傳新數據後,更新Shiny的'selectInput'下拉菜單和新值使用fileInput上傳新數據

應上傳保存到使用

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

在我app.R文件的文件中的數據,我首先定義了數據的「默認」值:

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

的我的app.R的內容如下:

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) 
    }) 
    }) 

的應用程序的初始視圖是預計:下拉菜單和表格都包含「默認」名稱。上傳包含新數據框的RDS文件時,表格會發生變化(這正是我正在查找的內容),但下拉值不會。我怎樣才能讓後者發生?

回答

1

我加入反應對象,你必須使用表contents,但更重要的是在selectInput更新的選擇(檢查observeupdateSelectInput部分)myData

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

號(T還)。文件上傳之前和之後,下拉菜單現在都填充了數字1,2和3。 – janverkade

+0

@janverkade你正在使用確切的代碼和相同的'myDataFrame'?你有沒有改變data.frames?我認爲行號與此有關。 – PoGibas

+0

是的 - 將您的代碼複製到我的app.R. – janverkade

0

以即興關閉@PoGibas'的答案,我需要加載多個列表值的應用,這裏是用reactiveValuesobserveEvent一個類似的應用程序:

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)