【问题标题】:R Shiny: Keep/retain values of reactive inputs after modifying selectionR Shiny:修改选择后保留/保留反应输入的值
【发布时间】:2016-11-01 23:34:54
【问题描述】:

在用户修改另一个 selectInput(multiple=T) 选项中的选择后,我试图将用户选择的值保留在动态生成的 selectInput 中。每当我修改我的选择时,所有动态生成的值都会被重置。

例如:

我最初从“Letters”selectInput中选择“A”、“B”和“C”,然后选择“1”; “1”、“2”;以及由“A”、“B”和“C”生成的动态生成的 selectInput 选项中的“1”、“2”、“3”。

初始选择:

然后我想修改“字母”选择输入选项中的选择,以便只选择“A”和“B”(即,我删除“C”)。完成此操作后,为“A”生成的所有值和为“B”生成的所有值(即“a”为“1”;“b”为“1”和“2”)都被重置。

为 a 和 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)

【问题讨论】:

  • 您可以尝试记住选择(将它们设置为全局变量),然后使用updateSelectInput 来恢复这些值。现在因为这些ab 选择每次都会重新渲染,所以选择会被重置
  • 我根据进度更新了代码。我已经能够使用 session$onFlush 保存先前选择的输入。现在我想弄清楚如何将这些保存的值合并到 updateSelectInput 中。任何帮助将不胜感激。

标签: r shiny


【解决方案1】:

我知道这是一篇相当老的帖子,但如果您还没有找到它,我相信这就是您正在寻找的答案:

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)

【讨论】:

  • 是的,它有效。您能否解释一下如何它是如何工作的?
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多