Подтвердить что ты не робот

R shiny Наблюдать за ходом Перед загрузкой пользовательского интерфейса, и это приводит к параметрам Null

Я столкнулся с проблемой, потому что наблюдение вызывается сначала до загрузки пользовательского интерфейса.

Вот мой ui.R

  sidebarPanel(
    selectInput("Desk", "Desk:" ,  as.matrix(getDesksUI())),
    uiOutput("choose_Product"), #this is dynamically created UI
    uiOutput("choose_File1"), #this is dynamically created UI
    uiOutput("choose_Term1"), #this is dynamically created UI  ....

Вот мой сервер .R

shinyServer(function(input, output,session) {

  #this is dynamic UI
  output$choose_Product <- renderUI({ 
    selectInput("Product", "Product:", as.list(getProductUI(input$Desk)))
  })

   #this is dynamic UI
  output$choose_File1 <- renderUI({
    selectInput("File1", "File 1:", as.list(getFileUI(input$Desk, input$Product)))
  })

  #this is dynamic UI and I want it to run before the Observe function so the call
  # to getTerm1UI(input$Desk, input$Product, input$File1) has non-null parameters
  output$choose_Term1 <- renderUI({
    print("Rendering UI for TERM")
    print(paste(input$Desk," ", input$Product, " ", input$File1,sep=""))
    selectInput("Term1", "Term:", getTerm1UI(input$Desk, input$Product, input$File1))
  })

Это моя функция наблюдения, и она запускается до ввода $Product и ввода $File1, поэтому я получаю сообщение об ошибке, потому что они оба являются NULL. Но мне нужно использовать ввод из пользовательского интерфейса.

   observe({ 
    print("in observe")
    print(input$Product)
    max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1))
    #max_plots<-5
            # Call renderPlot for each one. Plots are only actually generated when they
            # are visible on the web page.
            for (i in 1:max_plots )   {
              # Need local so that each item gets its own number. Without it, the value
              # of i in the renderPlot() will be the same across all instances, because
              # of when the expression is evaluated.
              local({
               my_i <- i
                plotname <- paste("plot", my_i, sep="")
                output[[plotname]] <- renderPlot({
                  plot(1:my_i, 1:my_i,
                       xlim = c(1, max_plots ),
                       ylim = c(1, max_plots ),
                        main = paste("1:", my_i, ". n is ", input$n, sep = "") )
                })
              })
            }##### End FoR Loop
 },priority = -1000)

Любая идея, как получить входные данные $Product и input $File1, чтобы быть заполненными до того, как наблюдается прогон?

Спасибо.

4b9b3361

Ответ 1

Самый простой способ - добавить проверку is.null(input$Product) в верхней части каждого наблюдения, чтобы она не запускалась до того, как инициализируются введенные ею входы.

Если вы не хотите, чтобы ваши наблюдатели выполняли нулевую проверку каждый раз, когда они запускаются, вы также можете использовать аргумент suspended = TRUE при регистрации их, чтобы они не запускались; затем напишите отдельного наблюдателя, который выполняет проверку, и когда он обнаружит, что все входы не равны нулю, вызывает resume() на приостановленных наблюдателях и приостанавливается.

Ответ 2

Вам нужно использовать Shiny Event Handler и использовать observeEvent вместо observe. Кажется, это единственный способ избавиться от сообщения "Unhandled error", вызванного значениями NULL при запуске приложения. Это происходит потому, что в отличие от observe обработчик события игнорирует значения NULL по умолчанию.

Таким образом, ваша функция наблюдения может выглядеть примерно так (нет необходимости в приоритетах или возобновлении/приостановлении и т.д.)

observeEvent(input$Product, ({

  max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1))
  ... (etc)      

  })# end of the function to be executed whenever input$Product changes
 )

Я не смог скопировать свой примерный код, чтобы он запускался, поэтому я не совсем уверен, как будет выглядеть ваша полная функция наблюдения.

Ответ 4

Нам нужен MRE, чтобы предоставить рабочий ответ, но при условии, что вам нужны input$Product и input$File1, но не хотите зависеть от них, только на input$Desk, вы могли бы:

observe({ 

  product <- isolate(input$Product)
  file1 <- isolate(input$File1)

  print("in observe")
  print(product)
  max_plots<-length(getTerm2UI(input$Desk, product, file1))
  for (i in 1:max_plots )   {
    # ...
  }
})

это, вероятно, фактически эквивалентно observeEvent(input$Desk, ....), но может предложить большую гибкость.

Ответ 5

Использование функции проверки и необходимости может решить эту проблему.