R Shiny:修改选择后保留/保留反应输入的值

Posted

技术标签:

【中文标题】R Shiny:修改选择后保留/保留反应输入的值【英文标题】:R Shiny: Keep/retain values of reactive inputs after modifying selection 【发布时间】: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 中。任何帮助将不胜感激。 【参考方案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)

【讨论】:

是的,它有效。您能否解释一下如何它是如何工作的?

以上是关于R Shiny:修改选择后保留/保留反应输入的值的主要内容,如果未能解决你的问题,请参考以下文章

R-Shiny:在文件输入上选择输入反应

将反应输入传递到 R Shiny 中的绘图轴

R Shiny Reactive 值,dplyr 过滤器错误?

如何避免 Shiny R 图中的闪烁错误?

如何在 Shiny 中引用 ui.R 中的反应元素

R Shiny DT - 使用反应式编辑表中的值