有没有很好的方法来保存在服务器端生成的shinyinput的状态(不重置)?
实施例
ui=shinyUI(fluidPage(
selectInput("select","",choices = c(1,2),multiple = T),
uiOutput("din_ui")
))
server=function(input, output,session) {
output$din_ui=renderUI({
lapply(input$select,function(i){
numericInput(inputId = paste0("num_",i),i,"")
})
})
}
shinyApp(ui,server)
如果我在select
中选择1,则在num_1
中插入一些值,而在select
中添加2,而不是num_1
重置为开始值。
答案 0 :(得分:3)
您可以读取numericInput值,并在控制init处设置控制值。见代码:
library(shiny)
ui=shinyUI(fluidPage(
selectInput("select","",choices = c(1,2),multiple = T),
uiOutput("din_ui")
))
server=function(input, output,session) {
output$din_ui=renderUI({
input$select
isolate(
lapply(X = input$select,
FUN = function(i){
cn <- paste0("num_",i)
numericInput(inputId = cn,
label = i,
value = ifelse(!is.null(input[[cn]]), input[[cn]], ''))
}
)
)
})
}
shinyApp(ui,server)
答案 1 :(得分:0)
还可以使用insertUI
(闪亮版&gt; = 14)找到其他方式
ui=shinyUI(fluidPage(
selectInput("select","",choices = c(1,2),multiple = T),
div(id="din_2")
))
server=function(input, output,session) {
sel_dat=reactiveValues(sel=NULL)
observeEvent(input$select,{
to_add=input$select[!input$select%in%sel_dat$sel]
for ( i in to_add){
insertUI(
selector = '#din_2',
where = "beforeEnd",
ui =numericInput(inputId = paste0("num_",i),i,"")
)
}
to_remove=sel_dat$sel[which(!sel_dat$sel %in% input$select)]
if(length(to_remove)>0){
removeUI(selector = paste0('div:has(>#num_',to_remove,")"))
}
sel_dat$sel=input$select
},ignoreNULL = FALSE)
}