2017-09-21 5 views
2

RDSファイルの読み込みによって値が設定されるドロップダウン選択ボックスが数多く含まれています。また、新しいデータをアップロードするためのfileInput関数も含まれています。新しいデータを反映するために、ドロップダウンボックスの値を変更するにはどうすればよいですか?現在、データはアップロードされていますが、古いデータはドロップダウンに残ります。fileInputを使用して新しいデータをアップロードした後、Shinyの 'selectInput'ドロップダウンリストを新しい値で更新しました

アップロードすべきデータが私のapp.Rファイルで

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

を使用してファイルに保存されて、私は最初のデータの「デフォルト」値を定義します。

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

アプリケーションの最初のビューがありますs expected:ドロップダウンと表の両方に「デフォルト」の名前が含まれています。新しいデータフレームを含むRDSファイルをアップロードすると、テーブルが変更されます(これは私が探していたものです)が、ドロップダウン値は変更されません。どのように私は後者を起こすことができますか?

答えて

1

私はあなたがテーブルcontentsのために使用する必要があり、反応物myDataを追加しましたが、もっと重要なのは(observeupdateSelectInput部分を確認してください)selectInputに選択肢を更新します。

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

いいえ(トンまだ)。ファイルのアップロードの前後に、ドロップダウンに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) 
関連する問題