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
来恢复这些值。现在因为这些a
、b
选择每次都会重新渲染,所以选择会被重置
我根据进度更新了代码。我已经能够使用 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:修改选择后保留/保留反应输入的值的主要内容,如果未能解决你的问题,请参考以下文章