shinyURL与updateSelectInput的交互

shinyURL与updateSelectInput的交互,r,shiny,R,Shiny,作为我的用户界面的一部分,用户选择一组驻留在三级深度列表结构底部的模型参数 在服务器端,我使用 observe({ updateSelectInput(session, 'level1', choices = attributes(model[[input$toplevel]])) }) observe({ updateSelectInput(session, 'level2', choices = attributes(model[[input$toplevel]][[inp

作为我的用户界面的一部分,用户选择一组驻留在三级深度列表结构底部的模型参数

在服务器端,我使用

observe({
    updateSelectInput(session, 'level1', choices = attributes(model[[input$toplevel]]))
})

observe({
    updateSelectInput(session, 'level2', choices = attributes(model[[input$toplevel]][[input$level1]]))
})
在ui selectInput部分中,选择level1时,level2设置为NULL。此操作将仅将选择框更新为上一级别选择的相应属性

保存的长URL名称不包括选定的级别1和级别2选项。但在使用时,始终只使用属性列表的顶部来进行两个级别的深层顶层选择

有没有聪明的办法?我假设这是selectInput的
selected=
的一些用法,但我似乎在胡思乱想,无法发现服务器端所谓的input$level1和input$level2的正确语法。
感谢

shinyURL通过将URL查询字符串中的名称与
输入
中的名称进行匹配来初始化用户输入。应用程序中发生的情况是,所有
selectInput
s在开始时都由shinyURL同时设置,但此更改会触发观察者执行,从而将输入重置为默认值

您可以通过使用函数
renderUI
动态呈现第二级和第三级输入来避免这种情况。这将允许延迟初始化,因为shinyURL等待设置输入,直到它们可用。有关此方法的说明,请参见下面的示例

library(shiny)
library(shinyURL)

data = list(
  A = list(
    a = as.list(1:3),
    b = as.list(4:6),
    c = as.list(7:9)
  ),
  B = list(
    d = as.list(1:3),
    e = as.list(4:6),
    f = as.list(7:9)
  )
)

ui <- shinyUI(fluidPage(

   # Application title
   titlePanel("Dynamic UI"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
         selectInput("toplevel", "Nested List", choices = names(data)),
         uiOutput("s1"),
         uiOutput("s2"),
         shinyURL.ui()
      ),

      mainPanel(
         h2("Selected level"),
         textOutput("selectedLevel")
      )
   )
))

server <- shinyServer(function(input, output) {
  shinyURL.server()

  output$s1 = renderUI(selectInput("lvl1",
                                   label = NULL,
                                   choices = names(data[[input$toplevel]])))
  output$s2 = renderUI({
    req(input$lvl1)
    selectInput("lvl2",
                label = NULL,
                choices = data[[input$toplevel]][[input$lvl1]])
    })

  output$selectedLevel = renderText(
    paste(input$toplevel, input$lvl1, input$lvl2, sep = " > ")
    )
})

# Run the application 
shinyApp(ui = ui, server = server)
请注意,我对原始示例进行了一些小的改进:

  • 将对
    attributes()
    的调用替换为
    names()
  • 添加了对
    req()的缺失调用。
  • id
    参数添加到
    tabsetPanel
    s以允许还原它们
  • ui.R
    server.R
    中的一些常见部分包装到函数中
  • 修改了生成输入矩阵的代码
    • @aoles

      我在这里的第一个答案是我的出发点。当我把它放在一起时,我注意到了一个有趣的细节。调用的URL-will-load level2值用于将topLevel设置为属性列表的第一个值的设置。第三级仍然错误

      GetModelParams.r中的模型

      model <- list()
      #*********************************************************
      
      #
      model$savory$creamcheese$wheat$beta <- 1
      model$savory$creamcheese$wheat$alpha <- 2
      model$savory$creamcheese$wheat$gamma <- 3
      #
      model$savory$creamcheese$raisin$beta <- 4
      model$savory$creamcheese$raisin$alpha <- 5
      model$savory$creamcheese$raisin$gamma <- 6
      
      #
      model$savory$lox$poppy$beta <- 7
      model$savory$lox$poppy$alpha <- 8
      model$savory$lox$poppy$gamma <- 9
      
      #
      model$savory$lox$sesame$beta <- 8
      model$savory$lox$sesame$alpha <- 7
      model$savory$lox$sesame$gamma <- 6
      
      #
      model$savory$butter$poppy$beta <- 5
      model$savory$butter$poppy$alpha <- 4
      model$savory$butter$poppy$gamma <- 3
      
      #
      model$savory$butter$wheat$beta <- 2
      model$savory$butter$wheat$alpha <- 1
      model$savory$butter$wheat$gamma <- 1
      
      #
      model$salty$bacon$toasted$beta <- 2
      model$salty$bacon$toasted$alpha <- 3
      model$salty$bacon$toasted$gamma <- 4
      
      #
      model$salty$bacon$untoasted$beta <- 5
      model$salty$bacon$untoasted$alpha <- 6
      model$salty$bacon$untoasted$gamma <- 7
      
      #
      model$sweet$jelly$white$beta <- 6
      model$sweet$jelly$white$alpha <- 5
      model$sweet$jelly$white$gamma <- 4
      
      #
      model$sweet$jelly$muffin$beta <- 3
      model$sweet$jelly$muffin$alpha <- 2
      model$sweet$jelly$muffin$gamma <- 1
      
      #
      model$sweet$jam$white$beta <- 7
      model$sweet$jam$white$alpha <- 11
      model$sweet$jam$white$gamma <- 13
      
      #
      model$sweet$jam$muffin$beta <- 1
      model$sweet$jam$muffin$alpha <- 3
      model$sweet$jam$muffin$gamma <- 5
      

      model@aoles第二个答案包含了您的建议。这基本上是作为URL调用后用户手动步骤通过设置“模型”参数变化,然后通过跟踪选项卡。我希望得到一些不需要人工操作的东西

      非常感谢您的关注

      模型参数文件相同

      ui.R:

      库(闪亮)
      图书馆(shinyURL)
      ##############################
      ###用户界面#####################
      ##############################
      来源(“GetModelParams.r”)
      
      非常感谢。这部分起作用。我的另一个复杂问题是,现在还不能让它成为一个完整的解决方案,我对一些3级深度模型参数选择有条件(不总是使用-因此不显示选项)。使用此解决方案,直到用户手动移动到设置它的选项卡,条件正确,模型选择为2个较低级别的NULL。原始的
      观察
      s处理了这个问题-但是正如你所说的,然后重写了URL输入集调用。我明白了,你可以分享一个简单的工作示例来说明这个问题吗?谢谢行。给我一天时间,这样我就可以脱光衣服了。谢谢。谢谢你发布了一个详细的例子,这在指出问题方面非常有帮助。请查看对我原始答案的编辑,以了解您问题的解决方案。谢谢。我刚开始R编码一个月。所以你不仅解决了我的问题,看起来你还整理了我一些笨拙的编码。再次感谢。
      model <- list()
      #*********************************************************
      
      #
      model$savory$creamcheese$wheat$beta <- 1
      model$savory$creamcheese$wheat$alpha <- 2
      model$savory$creamcheese$wheat$gamma <- 3
      #
      model$savory$creamcheese$raisin$beta <- 4
      model$savory$creamcheese$raisin$alpha <- 5
      model$savory$creamcheese$raisin$gamma <- 6
      
      #
      model$savory$lox$poppy$beta <- 7
      model$savory$lox$poppy$alpha <- 8
      model$savory$lox$poppy$gamma <- 9
      
      #
      model$savory$lox$sesame$beta <- 8
      model$savory$lox$sesame$alpha <- 7
      model$savory$lox$sesame$gamma <- 6
      
      #
      model$savory$butter$poppy$beta <- 5
      model$savory$butter$poppy$alpha <- 4
      model$savory$butter$poppy$gamma <- 3
      
      #
      model$savory$butter$wheat$beta <- 2
      model$savory$butter$wheat$alpha <- 1
      model$savory$butter$wheat$gamma <- 1
      
      #
      model$salty$bacon$toasted$beta <- 2
      model$salty$bacon$toasted$alpha <- 3
      model$salty$bacon$toasted$gamma <- 4
      
      #
      model$salty$bacon$untoasted$beta <- 5
      model$salty$bacon$untoasted$alpha <- 6
      model$salty$bacon$untoasted$gamma <- 7
      
      #
      model$sweet$jelly$white$beta <- 6
      model$sweet$jelly$white$alpha <- 5
      model$sweet$jelly$white$gamma <- 4
      
      #
      model$sweet$jelly$muffin$beta <- 3
      model$sweet$jelly$muffin$alpha <- 2
      model$sweet$jelly$muffin$gamma <- 1
      
      #
      model$sweet$jam$white$beta <- 7
      model$sweet$jam$white$alpha <- 11
      model$sweet$jam$white$gamma <- 13
      
      #
      model$sweet$jam$muffin$beta <- 1
      model$sweet$jam$muffin$alpha <- 3
      model$sweet$jam$muffin$gamma <- 5
      
      library(shiny)
      library(shinyURL)
      ##############################
      ### ui.R #####################
      ##############################
      
      source("GetModelParams.r")
      
      topLevel <- attributes(model)
      
      shinyUI(pageWithSidebar(
      
          headerPanel("URL conditional setting example"),
      
          sidebarPanel(
              tabsetPanel(
                  tabPanel("setup",
                           radioButtons(inputId = "nTraces",
                                        label = "multiple trace, single parameter variation ",
                                        choices = list("single trace" = 1, "2 traces" = 2, "3 traces" = 3, "4 traces" = 4)),
                           selectInput(inputId = "topLev1",
                                       label = "select top Level",
                                       choices = topLevel),
                           selectInput(inputId = "secondLev1",
                                       label = "select second level",
                                       choices = NULL),
                           selectInput(inputId = "thirdLev1",
                                       label = "select third level",
                                       choices = NULL),
                           numericInput(inputId = "area1",
                                        label = "Total gate area (um^2)",
                                        min = 1, max = 10, value = 5),
                           sliderInput(inputId = "temp1",
                                       label = "Temperature (C)",
                                       min = 85, max = 125, value = 125, step = 5)
                           ),
                  tabPanel("trace 2",
                           conditionalPanel(
                               condition = "input.nTraces == '2' || input.nTraces == '3' || input.nTraces == '4'",
                               radioButtons(inputId = "parVary",
                                            label = "choose single parameter variation ",
                                            choices = list("model" = "model",  "area" = "area", "temperature" = "temp")
                                            ),
                               conditionalPanel(
                                   condition = "input.parVary == 'model'",
                                   selectInput(inputId = "topLev2",
                                               label = "select top level",
                                               choices = topLevel),
                                   selectInput(inputId = "secondLev2",
                                               label = "select second level",
                                               choices = NULL),
                                   selectInput(inputId = "thirdLev2",
                                               label = "select third Level",
                                               choices = NULL)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'area'",
                                   numericInput(inputId = "area2",
                                                label = "Total gate area (um^2)",
                                                min = 1, max = 10, value = 5)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'temp'",
                                   sliderInput(inputId = "temp2",
                                               label = "Temperature (C)",
                                               min = 85, max = 125, value = 0, step = 5)
                               )
                           )
                           ),
                  tabPanel("trace 3",
                           conditionalPanel(
                               condition = "input.nTraces == '3' || input.nTraces == '4'",
                               conditionalPanel(
                                   condition = "input.parVary == 'model'",
                                   selectInput(inputId = "topLev3",
                                               label = "select top level",
                                               choices = topLevel),
                                   selectInput(inputId = "secondLev3",
                                               label = "select second level",
                                               choices = NULL),
                                   selectInput(inputId = "thirdLev3",
                                               label = "select third level",
                                               choices = NULL)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'area'",
                                   numericInput(inputId = "area3",
                                                label = "Total gate area (um^2)",
                                                min = 1, max = 10, value = 5)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'temp'",
                                   sliderInput(inputId = "temp3",
                                               label = "Temperature (C)",
                                               min = 85, max = 125, value = 0, step = 5)
                               )
                           )
                           ),
                  tabPanel("trace 4",
                           conditionalPanel(
                               condition = "input.nTraces == '4'",
                               conditionalPanel(
                                   condition = "input.parVary == 'model'",
                                   selectInput(inputId = "topLev4",
                                               label = "select top level",
                                               choices = topLevel),
                                   selectInput(inputId = "secondLev4",
                                               label = "select second level",
                                               choices = NULL),
                                   selectInput(inputId = "thirdLev4",
                                               label = "select third level",
                                               choices = NULL)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'area'",
                                   numericInput(inputId = "area4",
                                                label = "Total gate area (um^2)",
                                                min = 1, max = 10, value = 5)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'temp'",
                                   sliderInput(inputId = "temp4",
                                               label = "Temperature (C)",
                                               min = 85, max = 125, value = 0, step = 5)
                               )
                           )
                  ),
                  shinyURL.ui(tinyURL = FALSE)
              )
          ),
      
          mainPanel(
              tabsetPanel(
                  tabPanel("Output and data type", tableOutput("textDisplay")),
                  tabPanel("Model plots", plotOutput("modelPlot"))
              )
          )
      ))
      
      library(shiny)
      library(shinyURL)
      ##########################################
      ##### server.R ###########################
      ##########################################
      
      source("GetModelParams.r")
      
      shinyServer(function(input, output, session) {
          shinyURL.server(session)
          modelCalc <- function(temp,area,model)
          {
              hrs <- seq(from =0, to = 2, by = 0.05)
              F <- area*(model$alpha) + hrs*(model$beta)^3 + exp(model$gamma*(temp/100)*hrs)
              list(F = F, hrs = hrs)
          }
      
          observe({
              updateSelectInput(session, 'thirdLev4', choices = attributes(model[[input$topLev4]][[input$secondLev4]]))
          })
      
          observe({
              updateSelectInput(session, 'secondLev4', choices = attributes(model[[input$topLev4]]))
          })
      
          observe({
              updateSelectInput(session, 'thirdLev3', choices = attributes(model[[input$topLev3]][[input$secondLev3]]))
          })
      
          observe({
              updateSelectInput(session, 'secondLev3', choices = attributes(model[[input$topLev3]]))
          })
      
          observe({
              updateSelectInput(session, 'thirdLev2', choices = attributes(model[[input$topLev2]][[input$secondLev2]]))
          })
      
          observe({
              updateSelectInput(session, 'secondLev2', choices = attributes(model[[input$topLev2]]))
          })
      
          observe({
              updateSelectInput(session, 'thirdLev1', choices = attributes(model[[input$topLev1]][[input$secondLev1]]))
          })
      
          observe({
              updateSelectInput(session, 'secondLev1', choices = attributes(model[[input$topLev1]]))
          })
      
          output$modelPlot <- renderPlot({
              temp <- lapply(paste0("temp",1:as.numeric(input$nTraces)), function(x) input[[x]])
      
              area <- lapply(paste0("area",1:as.numeric(input$nTraces)), function(x) input[[x]])
      
              modelStr <- c("topLev", "secondLev", "thirdLev")
              modelCall <- lapply(1:as.numeric(input$nTraces), function(n) paste0(modelStr,n))
              modelIn <- lapply(modelCall,function(x) model[[input[[x[1]]]]][[input[[x[2]]]]][[input[[x[3]]]]])
              mLegendStr <- lapply(modelCall, function(x) paste(input[[x[1]]],input[[x[2]]],input[[x[3]]]))
      
              modelOut <- list()
              if(input$nTraces == '1')
              {
                  modelOut <- modelCalc(area=area[[1]],temp=temp[[1]],model=modelIn[[1]])
              } else
              {
                  modelOut <- switch(input$parVary,
                                 "model" = lapply(modelIn,modelCalc,area=area[[1]],temp=temp[[1]]),
                                 "temp" = lapply(temp,modelCalc,area=area[[1]],model=modelIn[[1]]),
                                 "area" = lapply(area,modelCalc,temp=temp[[1]],model=modelIn[[1]])
                                 )
              }
      
              if(input$nTraces =='1')
              {
                  modelOut_flat <- unlist(modelOut)
              } else
              {
                  modelOut_flat <- unlist(lapply(modelOut,unlist,recursive=FALSE))
              }
              colorVec <- c('red','blue','green','cyan','magenta','black')
              F_flat <- modelOut_flat[grep("^F",names(modelOut_flat))]
              hrs_flat <- modelOut_flat[grep("^hrs",names(modelOut_flat))]
              ylim_v <- range(F_flat[F_flat>0])
              xlim_h <- range(hrs_flat[hrs_flat>0])
      
              if(input$nTraces == '1')
              {
                  plot(modelOut$hrs[modelOut$F>0],modelOut$F[modelOut$F>0],
                       log="xy",pch=1, col=colorVec[1],
                       xlab="Time [hrs]", ylab="Model output",'o',
                       ylim=ylim_v,xlim=xlim_h)
              } else
              {
                  plot(modelOut[[1]]$hrs[modelOut[[1]]$F>0],modelOut[[1]]$F[modelOut[[1]]$F>0],
                       log="xy",pch=1, col=colorVec[1],
                       xlab="Time [hrs]",ylab="Model output",'o',
                       ylim=ylim_v,xlim=xlim_h)
              }
              grid(col="blue")
              if(input$nTraces != '1')
              {
                  for(i in 2:length(modelOut)) {
                      points(modelOut[[i]]$hrs[modelOut[[i]]$F>0],modelOut[[i]]$F[modelOut[[i]]$F>0],
                             pch=1,col=colorVec[i],'o')
      
                  }
              }
      
              leg.names <- switch(input$parVary,
                                  "temp" = sprintf('Temp=%.0f C',temp),
                                  "area" = sprintf('Area=%.2e um^2',area),
                                  "model"= sprintf('model=%s',mLegendStr)
                                  )
              legend("topleft",leg.names,bg="white",pch=1,lty=1,col=colorVec)
      
              par(ps=11)
              titleRet <-  switch(input$parVary,
                                  "temp" = title(sprintf("%s %s %s MODEL; Area=%.2eum^2", input$topLev1,input$secondLev1,input$thirdLev1,area[[1]])),
                                  "area" = title(sprintf("%s %s %s MODEL; temp=%.0fC", input$topLev1,input$secondLev1,input$thirdLev1,temp[[1]])),
                                  "model"= title(sprintf("MODEL; temp=%.0fC; Area=%.2eum^2", temp[[1]],area[[1]]))
                                  )
          })
      
          output$textDisplay <- renderTable({
              getMat = matrix(c(input$nTraces, class(input$nTraces),
                                input$topLev1, class(input$topLev1),
                                input$secondLev1, class(input$secondLev1),
                                input$thirdLev1, class(input$thirdLev1),
                                input$temp1, class(input$temp1),
                                input$area1, class(input$area1),
                                input$topLev2, class(input$topLev2),
                                input$secondLev2, class(input$secondLev2),
                                input$thirdLev2, class(input$thirdLev2),
                                input$temp2, class(input$temp2),
                                input$area2, class(input$area2),
                                input$topLev3, class(input$topLev3),
                                input$secondLev3, class(input$secondLev3),
                                input$thirdLev3, class(input$thirdLev3),
                                input$temp3, class(input$temp3),
                                input$area3, class(input$area3),
                                input$parVary, class(input$parVary)
                                ), ncol=2, byrow = TRUE)
              colnames(getMat) = c("Value", "Class")
              getMat
          })
      })
      
      library(shiny)
      library(shinyURL)
      ##############################
      ### ui.R #####################
      ##############################
      
      source("GetModelParams.r")
      
      topLevel <- attributes(model)
      
      shinyUI(pageWithSidebar(
      
          headerPanel("URL conditional setting example"),
      
          sidebarPanel(
              tabsetPanel(
                  tabPanel("setup",
                           radioButtons(inputId = "nTraces",
                                        label = "multiple trace, single parameter variation ",
                                        choices = list("single trace" = 1, "2 traces" = 2, "3 traces" = 3, "4 traces" = 4)),
                           selectInput(inputId = "topLev1",
                                       label = "select top Level",
                                       choices = topLevel),
                           uiOutput("sec1"),
                           uiOutput("thrd1"),
                           numericInput(inputId = "area1",
                                        label = "Total gate area (um^2)",
                                        min = 1, max = 10, value = 5),
                           sliderInput(inputId = "temp1",
                                       label = "Temperature (C)",
                                       min = 85, max = 125, value = 125, step = 5)
                           ),
                  tabPanel("trace 2",
                           conditionalPanel(
                               condition = "input.nTraces == '2' || input.nTraces == '3' || input.nTraces == '4'",
                               radioButtons(inputId = "parVary",
                                            label = "choose single parameter variation ",
                                            choices = list("model" = "model",  "area" = "area", "temperature" = "temp")
                                            ),
                               conditionalPanel(
                                   condition = "input.parVary == 'model'",
                                   selectInput(inputId = "topLev2",
                                               label = "select top level",
                                               choices = topLevel),
                                   uiOutput("sec2"),
                                   uiOutput("thrd2")
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'area'",
                                   numericInput(inputId = "area2",
                                                label = "Total gate area (um^2)",
                                                min = 1, max = 10, value = 5)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'temp'",
                                   sliderInput(inputId = "temp2",
                                               label = "Temperature (C)",
                                               min = 85, max = 125, value = 0, step = 5)
                               )
                           )
                           ),
                  tabPanel("trace 3",
                           conditionalPanel(
                               condition = "input.nTraces == '3' || input.nTraces == '4'",
                               conditionalPanel(
                                   condition = "input.parVary == 'model'",
                                   selectInput(inputId = "topLev3",
                                               label = "select top level",
                                               choices = topLevel),
                                   uiOutput("sec3"),
                                   uiOutput("thrd3")
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'area'",
                                   numericInput(inputId = "area3",
                                                label = "Total gate area (um^2)",
                                                min = 1, max = 10, value = 5)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'temp'",
                                   sliderInput(inputId = "temp3",
                                               label = "Temperature (C)",
                                               min = 85, max = 125, value = 0, step = 5)
                               )
                           )
                           ),
                  tabPanel("trace 4",
                           conditionalPanel(
                               condition = "input.nTraces == '4'",
                               conditionalPanel(
                                   condition = "input.parVary == 'model'",
                                   selectInput(inputId = "topLev4",
                                               label = "select top level",
                                               choices = topLevel),
                                   uiOutput("sec4"),
                                   uiOutput("thrd4")
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'area'",
                                   numericInput(inputId = "area4",
                                                label = "Total gate area (um^2)",
                                                min = 1, max = 10, value = 5)
                               ),
                               conditionalPanel(
                                   condition = "input.parVary == 'temp'",
                                   sliderInput(inputId = "temp4",
                                               label = "Temperature (C)",
                                               min = 85, max = 125, value = 0, step = 5)
                               )
                           )
                  ),
                  shinyURL.ui(tinyURL = FALSE)
              )
          ),
      
          mainPanel(
              tabsetPanel(
                  tabPanel("Output and data type", tableOutput("textDisplay")),
                  tabPanel("Model plots", plotOutput("modelPlot"))
              )
          )
      ))
      
      library(shiny)
      library(shinyURL)
      ##########################################
      ##### server.R ###########################
      ##########################################
      
      source("GetModelParams.r")
      
      shinyServer(function(input, output, session) {
          shinyURL.server(session)
          modelCalc <- function(temp,area,model)
          {
              hrs <- seq(from =0, to = 2, by = 0.05)
              F <- area*(model$alpha) + hrs*(model$beta)^3 + exp(model$gamma*(temp/100)*hrs)
              list(F = F, hrs = hrs)
          }
      
          output$sec1 <- renderUI({
              selectInput(inputId = "secondLev1",
                          label = "select second level",
                          choices = attributes(model[[input$topLev1]])
                          )
          })
      
          output$thrd1 <- renderUI({
              req(input$secondLev1)
              selectInput(inputId = "thirdLev1",
                          label = "select third level",
                          choices = attributes(model[[input$topLev1]][[input$secondLev1]])
                          )
          })
      
          output$sec2 <- renderUI({
              selectInput(inputId = "secondLev2",
                          label = "select second level",
                          choices = attributes(model[[input$topLev2]])
                          )
          })
      
          output$thrd2 <- renderUI({
              selectInput(inputId = "thirdLev2",
                          label = "select third level",
                          choices = attributes(model[[input$topLev2]][[input$secondLev2]])
                          )
          })
      
          output$sec3 <- renderUI({
              selectInput(inputId = "secondLev3",
                          label = "select second level",
                          choices = attributes(model[[input$topLev3]])
                          )
          })
      
          output$thrd3 <- renderUI({
              selectInput(inputId = "thirdLev3",
                          label = "select third level",
                          choices = attributes(model[[input$topLev3]][[input$secondLev3]])
                          )
          })
      
          output$sec4 <- renderUI({
              selectInput(inputId = "secondLev4",
                          label = "select second level",
                          choices = attributes(model[[input$topLev4]])
                          )
          })
      
          output$thrd4 <- renderUI({
              selectInput(inputId = "thirdLev4",
                          label = "select third level",
                          choices = attributes(model[[input$topLev4]][[input$secondLev4]])
                          )
          })
      
          output$modelPlot <- renderPlot({
              temp <- lapply(paste0("temp",1:as.numeric(input$nTraces)), function(x) input[[x]])
      
              area <- lapply(paste0("area",1:as.numeric(input$nTraces)), function(x) input[[x]])
      
              modelStr <- c("topLev", "secondLev", "thirdLev")
              modelCall <- lapply(1:as.numeric(input$nTraces), function(n) paste0(modelStr,n))
              modelIn <- lapply(modelCall,function(x) model[[input[[x[1]]]]][[input[[x[2]]]]][[input[[x[3]]]]])
              mLegendStr <- lapply(modelCall, function(x) paste(input[[x[1]]],input[[x[2]]],input[[x[3]]]))
      
              modelOut <- list()
              if(input$nTraces == '1')
              {
                  modelOut <- modelCalc(area=area[[1]],temp=temp[[1]],model=modelIn[[1]])
              } else
              {
                  modelOut <- switch(input$parVary,
                                 "model" = lapply(modelIn,modelCalc,area=area[[1]],temp=temp[[1]]),
                                 "temp" = lapply(temp,modelCalc,area=area[[1]],model=modelIn[[1]]),
                                 "area" = lapply(area,modelCalc,temp=temp[[1]],model=modelIn[[1]])
                                 )
              }
      
              if(input$nTraces =='1')
              {
                  modelOut_flat <- unlist(modelOut)
              } else
              {
                  modelOut_flat <- unlist(lapply(modelOut,unlist,recursive=FALSE))
              }
              colorVec <- c('red','blue','green','cyan','magenta','black')
              F_flat <- modelOut_flat[grep("^F",names(modelOut_flat))]
              hrs_flat <- modelOut_flat[grep("^hrs",names(modelOut_flat))]
              ylim_v <- range(F_flat[F_flat>0])
              xlim_h <- range(hrs_flat[hrs_flat>0])
      
              if(input$nTraces == '1')
              {
                  plot(modelOut$hrs[modelOut$F>0],modelOut$F[modelOut$F>0],
                       log="xy",pch=1, col=colorVec[1],
                       xlab="Time [hrs]", ylab="Model output",'o',
                       ylim=ylim_v,xlim=xlim_h)
              } else
              {
                  plot(modelOut[[1]]$hrs[modelOut[[1]]$F>0],modelOut[[1]]$F[modelOut[[1]]$F>0],
                       log="xy",pch=1, col=colorVec[1],
                       xlab="Time [hrs]",ylab="Model output",'o',
                       ylim=ylim_v,xlim=xlim_h)
              }
              grid(col="blue")
              if(input$nTraces != '1')
              {
                  for(i in 2:length(modelOut)) {
                      points(modelOut[[i]]$hrs[modelOut[[i]]$F>0],modelOut[[i]]$F[modelOut[[i]]$F>0],
                             pch=1,col=colorVec[i],'o')
      
                  }
              }
      
              leg.names <- switch(input$parVary,
                                  "temp" = sprintf('Temp=%.0f C',temp),
                                  "area" = sprintf('Area=%.2e um^2',area),
                                  "model"= sprintf('model=%s',mLegendStr)
                                  )
              legend("topleft",leg.names,bg="white",pch=1,lty=1,col=colorVec)
      
              par(ps=11)
              titleRet <-  switch(input$parVary,
                                  "temp" = title(sprintf("%s %s %s MODEL; Area=%.2eum^2", input$topLev1,input$secondLev1,input$thirdLev1,area[[1]])),
                                  "area" = title(sprintf("%s %s %s MODEL; temp=%.0fC", input$topLev1,input$secondLev1,input$thirdLev1,temp[[1]])),
                                  "model"= title(sprintf("MODEL; temp=%.0fC; Area=%.2eum^2", temp[[1]],area[[1]]))
                                  )
          })
      
          output$textDisplay <- renderTable({
              getMat = matrix(c(input$nTraces, class(input$nTraces),
                                input$topLev1, class(input$topLev1),
                                input$secondLev1, class(input$secondLev1),
                                input$thirdLev1, class(input$thirdLev1),
                                input$temp1, class(input$temp1),
                                input$area1, class(input$area1),
                                input$topLev2, class(input$topLev2),
                                input$secondLev2, class(input$secondLev2),
                                input$thirdLev2, class(input$thirdLev2),
                                input$temp2, class(input$temp2),
                                input$area2, class(input$area2),
                                input$topLev3, class(input$topLev3),
                                input$secondLev3, class(input$secondLev3),
                                input$thirdLev3, class(input$thirdLev3),
                                input$temp3, class(input$temp3),
                                input$area3, class(input$area3),
                                input$parVary, class(input$parVary)
                                ), ncol=2, byrow = TRUE)
              colnames(getMat) = c("Value", "Class")
              getMat
          })
      })