Shiny: Ошибка при динамическом создании числовых входов с использованием списков
Я пытаюсь динамически генерировать пользовательские входные данные на основе нескольких предварительно определенных списков, моя цель - облегчить поддержку кода, позволяя ему соответствовать предварительно определенным структурам данных. Ниже приведен код и объяснение упрощенной версии проблемы, с которой я столкнулся:
library(shiny)
distributions <- list(
"Distribution 1" = list("Distribution 1 Parameter 1" = list("Lower" = 0, "Upper" = Inf, "Default" = 1))
)
models <- list(
"General Model 1" = list("Specific Model 1")
)
parameters <- list(
"Specific Model 1" = list("Specific Model 1 Parameter 1")
)
ui <- fluidPage(
# Model selection
fluidRow(
selectInput("generalModel", "General Model", names(models)),
selectInput("specificModel", "Specific Model", models[[1]]),
tabsetPanel(
# Tab for inputs
tabPanel(
title = "Inputs",
uiOutput("inputsTabs")
)
)
)
)
server <- function(input, output, session) {
# Handling model selection
observe({
updateSelectInput(session, "specificModel", choices = models[[input$generalModel]])
})
# Displaying inputs for a specific model in tabs
output$inputsTabs <- renderUI({
nTabs = length(parameters[[input$specificModel]])
tabs = lapply(seq_len(nTabs), function(i) {
tabPanel(
paste0(parameters[[input$specificModel]][[i]]),
uiOutput(paste0(input$specificModel, "Input", parameters[[input$specificModel]][[i]]))
)
})
do.call(tabsetPanel, tabs)
})
# Creating inputs for each specific parameter
observe(
lapply(seq_len(length(parameters[[input$specificModel]])), function(i) {
output[[paste0(input$specificModel, "Input", parameters[[input$specificModel]][[i]])]] <- renderUI({
distribution <- paste0(input$specificModel, "Input", parameters[[input$specificModel]][[i]], "Distribution")
selectInput(inputId = distribution, label = "Distribution", choices = names(distributions))
uiOutput(paste0(distribution, "Parameters"))
})
}),
priority = 100
)
# Creating inputs for each specific parameter
observe(
lapply(seq_len(length(parameters[[input$specificModel]])), function(i) {
distribution <- paste0(input$specificModel, "Input", parameters[[input$specificModel]][[i]], "Distribution")
output[[paste0(distribution, "Parameters")]] <- renderUI({
nNumericInputs = length(distributions[[input[[distribution]]]])
numericInputs = lapply(seq_len(nNumericInputs), function(i) {
numericInput(
inputId = paste0(distribution, input[[input[[distribution]]]], distributions[[input[[distribution]]]][[i]]),
label = paste0(distributions[[input[[distribution]]]][[i]]),
value = distributions[[input[[distribution]]]][[i]][[3]],
max = distributions[[input[[distribution]]]][[i]][[2]],
min = distributions[[input[[distribution]]]][[i]][[1]]
)
})
do.call(wellPanel, numericInputs)
})
}),
priority = 50
)
}
shinyApp(ui = ui, server = server)
Все пользовательские входы, описанные ниже, генерируются на основе параметров, моделей и списков распределений, определенных перед пользовательским интерфейсом в блестящем приложении выше.
Таким образом, пользователь начинает с выбора общей модели, за которой следует конкретная модель из двух выпадающих меню соответственно. Затем, в зависимости от конкретной модели, вкладка Входы заполняется вкладками, соответствующими параметрам выбранной модели. Затем пользователь может выбрать распределение для каждого параметра из выпадающего меню на вкладке.
После этого пользователь должен иметь возможность вводить серию числовых входов, соответствующих параметрам распределения. Я пытался динамически генерировать эти числовые данные, но я продолжаю получать:
Error: attempt to select less than one element in get1index
Код моей попытки находится в конце приложения и закомментирован, раскомментируйте его, чтобы воспроизвести ошибку.