2016-06-30 7 views
3

ユーザが別のselectInput(multiple=T)オプションで選択を変更した後に、動的に生成されたselectInputにユーザが選択した値を保持しようとしています。選択内容を変更すると、動的に生成された値はすべてリセットされます。例えばR Shiny:選択を変更した後に無効入力の値を保持/保持する

:私は最初に "手紙" selectInputから "A"、 "B"、および "C" を選択し、 "1" を選択

。 "1"、 "2"; "A"、 "B"、 "C"によって生成された動的に生成されたselectInputオプションから "1"、 "2"、 "3"

最初の選択:

Initial Selections

は、その後、私は唯一の「A」と「B」が選択されている(つまり、私は「C」を削除するように「文字」selectInputオプションで自分の選択を変更したいです)。この後、「A」に対して生成されたすべての値および「B」に対して生成されたすべての値(「a」については「1」、「b」については「1」および「2」)がリセットされる。

リセットおよびBの(空の)値:

Reset (empty) values for a and b

私は(最初に選択した場合)、Cを削除した後、aとbの値を保持できますか?

library(shiny) 

ui <- fluidPage(
    sidebarPanel(
    uiOutput("n1"), 
    uiOutput("n2") 
), 
    mainPanel(
    textOutput("Current"), 
    textOutput("Old") 
) 
) 

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

    output$n1 <- renderUI({ 
    selectInput("no1", "Letters", choices=c("A", "B", "C"), multiple=T) 
    }) 

    output$n2 <- renderUI({ 
    if(!is.null(input$no1)){ 
     lst <- vector("list", length(input$no1)) 
     for(i in 1:length(lst)){ 
     lst[[i]] <- selectInput(input$no1[i], input$no1[i], choices=c(1,2,3), multiple=T) 
     } 
     return(lst) 
    } 
    }) 

# observe({lk <<- reactiveValuesToList(input)}) 

    Values <- reactiveValues(old="start") 

    session$onFlush(once=FALSE, function(){ 
    isolate({ Values$old<-input$A }) 
    }) 

    output$Current <- renderText({paste(input$A)}) 
    output$Old  <- renderText({paste(Values$old)}) 

# observe({ 
# updateSelectInput(session, "A", "A", choices=c(1,2,3), selected=Values$old) 
# }) 

} 

shinyApp(ui,server) 
+1

あなたがそれらを設定する(選択肢を覚えて試みることができますグローバル変数に変換してから、 'updateSelectInput'を使って値を復元してください。今のところ、これらの 'a'、' b'選択は毎回再レンダリングされるので、選択肢はリセットされます –

+0

私の進歩に基づいてコードを更新しました。セッション$ onFlushを使って前の選択の入力を保存できました。今私はこれらの保存された値をupdateSelectInputに組み込む方法を理解しようとしています。どんな助けでも大歓迎です。 – JHou

答えて

4

私はこれはかなり古いポストで実現するが、私は、これはあなたがまだそれを見つけていない場合は、探している答えであると信じて:

library(shiny) 

ui <- fluidPage(
    sidebarPanel(
    uiOutput("n1"), 
    uiOutput("n2") 
), 
    mainPanel(
    textOutput("Current"), 
    textOutput("Old") 
) 
) 

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

    output$n1 <- renderUI({ 
    selectInput("no1", "Letters", choices=c("A", "B", "C"), multiple=T) 
    }) 

    output$n2 <- renderUI({ 
    if(!is.null(input$no1)){ 
     lst <- vector("list", length(input$no1)) 
     for(i in 1:length(lst)){ 
     lst[[i]] <- selectInput(input$no1[i], input$no1[i], choices=c(1,2,3), multiple=T) 
     } 
     return(lst) 
    } 
    }) 

    #This is the added code 
    observe({ 
     updateSelectInput(session, "A", "A",selected=lapply(reactiveValuesToList(input), unclass)$A) 
     updateSelectInput(session, "B", "B", selected=lapply(reactiveValuesToList(input), unclass)$B) 
     updateSelectInput(session, "C", "C", selected=lapply(reactiveValuesToList(input), unclass)$C) 
    }) 

} 

shinyApp(ui,server) 
+0

はい、動作します。どのように*動作するか説明していただけますか? –

関連する問題