Я пытаюсь создать интерактивный пользовательский интерфейс с блестящей. На основе первого выбора он создает набор вкладок, и в этом наборе вкладок на основе второго выбора создается другой пользовательский интерфейс. Приведенный ниже код работает, но я не могу понять, как я мог бы заменить X = 1: 10 на 1: n () в строке 82 ...
Спасибо за любые предложения:)
(но, пожалуйста, будь хорошим, потому что я большой плач)
library(shiny)
# 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 <- reactive({
req(input$factor)
length(input$factor)
})
# insert UI
lapply(
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(
selectInput(paste0("sample_",i),"Choose sample",samples),
id = id
)
)
} else {
removeUI(
# pass in appropriate div id
selector = paste0('#div_',i)
)
}
}, ignoreInit = TRUE)
}
)
observeEvent(input$btn,{
print(n())
})
session$onSessionEnded(function(session){
# stop the application
stopApp()
})
}
shinyApp(ui = ui, server = server)