I don't really understand what you mean.
Is there a way to have the removeUI do it's job before every update?
I have a more extended example here:
# library(devtools)
# devtools::install_github("daattali/chooserInput")
library(shiny)
library(chooserInput)
# functions for creating ui from reactive values with loop
# create headers in fluidRow columns from list of headers (for combi chooserinput)
ui_header <- function(list){
req(list)
l_header <- c()
n <- length(list)
for(i in 1:n){
l_header <-append(l_header,paste0(
"column(",floor(12/n),", p('",list[i],"'))"))
}
x<-paste(l_header,collapse=",")
header<-paste0("fluidRow(",x,")")
return(header)
}
# create chooserinput in fluidrow from list
# results will be in input$chooser_listitem
ui_chooserinput <- function(list, choices){
req(list)
n <- length(list)
# remove commas and spaces from name for inputID
list <- lapply(list, function(x) gsub(" ","_",x))
list <- lapply(list, function(x) gsub(",","",x))
opt <- paste0("c('",paste(choices,collapse="','"),"')")
# if there is only one option, select all samples
if(n == 1){
x <- paste0(
"column(",floor(12/n),", chooserInput('chooser_",list,"', 'Available', 'Selected',
c(), ",opt,", numLines = 10, multiple = TRUE ))")
} else {
l_in<-c()
for(i in 1:n){
l_in <- append(l_in,paste0(
"column(",floor(12/n),", chooserInput('chooser_",list[i], "', 'Available', 'Selected',
",opt,", c(), numLines = 10, multiple = TRUE ))"))
}
x<-paste(l_in,collapse=",")
}
select_sample<-paste0("fluidRow(",x,")")
return(select_sample)
}
# constants for example
factors <- LETTERS[1:10]
factor_values <- c()
for(i in factors){
factor_values[[i]] <- paste0(i,1:5)
}
samples <- paste0("sample_",1:10)
# UI
ui <- fluidPage(
h3("Choose factors"),
selectizeInput("factor","Select all known factors:",factors, multiple=TRUE),
tags$br(),
uiOutput("tabset"),
actionButton("btn","print stuff that's happening, cause wtf...")
)
# server
server <- function(input, output, session){
factor_val_list <- reactive({
req(input$factor)
f <- input$factor
l <- c()
for( i in 1:length(f) ){
l[[i]] <- factor_values[[f[i]]]
}
return(l)
})
ui_tabset_factor <- reactive({
req(input$factor)
# list of chosen factors
factor <- input$factor
l <- c()
for(i in 1:length(factor)){
tab <- paste0(
"tabPanel('",factor[i],"', tags$br(),
selectizeInput(
inputId = 'fv_", i,"',
label=p('Select all different values for the factor in the experiment: '),
choices=factor_val_list()[[",i,"]],
multiple=TRUE),
checkboxInput('",paste0("check_",i),"','Check this box when the list is complete.'),
tags$br(),
p('Assign the samples to the right category:'),
tags$div(id = 'placeholder_",i,"')
)")
# create list of tabpanels from chosen factors
l <- append(l, tab)
}
# seperate them with comma's
tabs <- paste(l, collapse=",")
# create tabsetpanel with created tabs
ui <- paste0("tabsetPanel(type = 'tabs',",tabs,")")
})
output$tabset <- renderUI({
# renderUI from text creating tabsetpanel
eval(parse(text=ui_tabset_factor()))
})
n_factor <- reactive({
req(input$factor)
length(input$factor)
})
# insert UI chooserinput
observe({
lapply(
X = 1:n_factor(),
#X = 1:10,
FUN = function(i){
observeEvent(input[[paste0("check_",i)]], {
id <- paste0('div_', i)
if(input[[paste0("check_",i)]] == 1){
insertUI(
selector = paste0('#placeholder_',i),
## wrap element in a div with id for ease of removal
ui = tags$div(
eval(parse(text = ui_header(input[[paste0("fv_",i)]]))),
eval(parse(
text = ui_chooserinput(input[[paste0("fv_",i)]],samples)
)),
id = id
)
)
} else {
removeUI(
## pass in appropriate div id
selector = paste0('#div_',i)
)
}
}, ignoreInit = TRUE)
}
)
})
# # working example chooserinput
# output$ui_fv1 <- renderUI({
# req(input$factor_val_1)
# eval(parse(text = ui_header(input$factor_val_1)))
# })
#
#
# output$ui_fv2 <- renderUI({
# req(input$factor_val_1)
# eval(parse(
# text = ui_chooserinput(input$factor_val_1,samples_in_exp2()[,"Sample"])
# ))
# })
# works fine
observeEvent(input$btn,{
#print(ui_tabset_factor())
print(n_factor())
})
session$onSessionEnded(function(session){
# stop the application
stopApp()
})
}
shinyApp(ui = ui, server = server)