本文介绍了r在加载UI之前观察运行情况,这会导致参数为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了一个问题,因为在加载UI之前首先调用了Object。

这是我的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之前运行,因此我得到一个错误,因为它们都为空。但是我需要使用来自UI的输入。

   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和输入$File1吗?

谢谢您。

推荐答案

编辑:向下滚动到TClavelle的答案以获得更好的解决方案。虽然这个答案获得的好评最多,但我写这个答案的时候,Shiny的功能比今天少。

最简单的方法是在每个观察的顶部添加is.null(input$Product)检查,以防止它在其使用的输入初始化之前运行。

如果您不希望您的观察器在每次运行时都执行NULL检查,您也可以在注册它们时使用suspended = TRUE参数来阻止它们运行;然后编写一个单独的观察器来执行检查,当它发现所有输入都非NULL时,将对挂起的观察器调用Resume()并挂起自身。

这篇关于r在加载UI之前观察运行情况,这会导致参数为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 15:06