直到调用依赖于renderUI的反应函数时才执行renderUI

时间:2014-08-12 14:30:02

标签: r shiny ggvis

在我的闪亮应用程序中,我有两个选项卡:选项卡1有一个checkboxInput和一个selectInput,它在server.R中编码为一个renderUI,仅在选中该复选框时显示。在选项卡2中,有一个ggvis函数,用于绘制仅当选项卡1中显示selectInput时通过反应函数生成的数据框。

出乎意料的是,除非我先单击选项卡2然后返回选项卡1,否则selectInput不会显示在选项卡1中,即使selectInput仅依赖于同一选项卡中的复选框,即选项卡1

显然,我没有理解正确的反应功能。你能否指出我的错误在哪里?谢谢!

P.S。结构非常复杂,但我需要的是真正的"真实的"应用

ui.R

library(ggvis)

shinyUI(navbarPage("",
                   tabPanel("1",
                              checkboxInput("START", label = "Start calculations", value = F),
                              htmlOutput("SELECT")
                   ),
                   tabPanel("2",
                            ggvisOutput("PLOT")
                   )
))

server.R

library(ggvis)

shinyServer(function(input, output, session) {

  output$SELECT<-renderUI({ 
    if (input$START==T) {
    selectInput("SELECTINPUT","Make your choice:",c(1,2))
    }
  })

  PLOTDF<-reactive({
    if (is.null(input$SELECTINPUT)==F) {
      plotdf<-data.frame(c(1,1,2,2),c(1,2,3,4))
      colnames(plotdf)<-c("X","Y")
      plotdf
    }
  })

  reactive({
    PLOTDF() %>% ggvis(~X,~Y) %>% layer_points
    }) %>% bind_shiny("PLOT")

})

1 个答案:

答案 0 :(得分:2)

不确定is.null(input$SELECTINPUT)==F正在做什么我猜你想要像!is.null(input$SELECTINPUT)这样的东西也可以将ggvis调用包装在观察者中并检查输入

以下适用于我:

library(ggvis)
library(shiny)
runApp(list(ui = navbarPage("",
                            tabPanel("1",
                                     checkboxInput("START", label = "Start calculations", value = F),
                                     htmlOutput("SELECT")
                            ),
                            tabPanel("2",
                                     ggvisOutput("PLOT")
                            )
)
, server = function(input, output, session) {

  output$SELECT<-renderUI({ 
    if (input$START==T) {
      selectInput("SELECTINPUT","Make your choice:",c(1,2))
    }
  })
   PLOTDF<-reactive({
    if (!is.null(input$SELECTINPUT)) {
      plotdf<-data.frame(c(1,1,2,2),c(1,2,3,4))
      colnames(plotdf)<-c("X","Y")
      plotdf
    }
  })
  observe({
    if (!is.null(input$SELECTINPUT)) {
    PLOTDF() %>% ggvis(~X,~Y) %>% layer_points%>% bind_shiny("PLOT")
    }
  }) 
}
)
)