【问题标题】:renderUI not executed until a reactive function dependent on renderUI is called在调用依赖于 renderUI 的反应函数之前,不会执行 renderUI
【发布时间】:2014-10-05 16:17:23
【问题描述】:

在我闪亮的应用程序中,我有两个选项卡:选项卡 1 有一个 checkboxInput 和一个 selectInput,它们在 server.R 中被编码为 renderUI,只有在选中该框时才会显示。在突片2中,存在GGVIS功能,用于绘制在选项卡1中所示的选择input时唯一通过反应函数进行的数据帧。

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

显然,我没有正确理解反应函数的概念。你能指出我的错误在哪里吗?谢谢!

附:结构相当复杂,但它是我的“真正”应用所需要的。

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")

})

【问题讨论】:

  • 你发布的代码对我来说立即崩溃了。
  • 这很奇怪,因为它对我有用(我也尝试从我的消息中复制粘贴它)。您收到任何错误消息吗?
  • 是的,“没有提供给标记的数据”。也许我有不同版本的闪亮或 ggvis。 ggvis:0.3.0.99;闪亮的 0.1
  • 忽略此消息。出现是因为 ggvis 绘图需要 PLOTDF - 并且在开始之后 PLOTDF 尚未创建。我稍后会在 ggvis 表达式中添加一个“if”条件,但目前所有这些都不会阻止代码执行,尽管显示了一些这样的错误消息(至少它在我的机器上有效)。

标签: r shiny ggvis


【解决方案1】:

不确定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")
    }
  }) 
}
)
)

【讨论】:

  • 这行得通,非常感谢!能否请您简单解释一下为什么reactive 无法正常工作?
  • reactive 表达式使用惰性求值,当它们的依赖关系发生变化时,它们不会立即重新执行,而是等待其他人调用它们。观察者在他们的依赖关系发生变化时立即使用急切的评估变化。 no data supplied to mark 需要 if 子句,这对观察者来说似乎更自然。
猜你喜欢
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2018-07-04
  • 1970-01-01
  • 2015-10-27
相关资源
最近更新 更多