在使用conditionalPanel隐藏之前绘制渲染

时间:2015-01-16 16:52:25

标签: r shiny

我有一个图表,如果渲染时间不长,我只想显示,否则我想要一个按钮,用户可以按下来渲染它。 我的问题是图形在某些情况下隐藏之前呈现。

打开此最低限度复制的示例并尝试以下步骤

UI.r

shinyUI(fluidPage(


titlePanel("when to render"),
  fluidRow(
    column(2,radioButtons("TheChoice", label= "choices",
                          choices = list("only one" = 1,"just two" = 2,"three" = 3,"all four" = 4),selected = 1))
  ),
  fluidRow(
    mainPanel(tabsetPanel(tabPanel("Blank page",NULL),
                          tabPanel("plot output",
                                   verbatimTextOutput("validRows"),
                                   conditionalPanel(
                                     condition = "output.validRows  < 3",
                                     plotOutput("thePlot")
                                   ))
                          )
             )
  )
))

Server.r

library(shiny)
library(ggplot)
library(reshape2)
`[` <- function(...) base::`[`(...,drop=FALSE)
myTable <- matrix(1:20,ncol=4)
colnames(myTable) <- c("Index","catone","cattwo","catthree")
rownames(myTable) <- c("first","second","third","fourth","fifth")
shinyServer(function(input, output,session) {
  TableIndex <- reactiveValues(X = NULL)
  observe({
    print("updating TableIndex")
    if(input$TheChoice == 1) TableIndex$X <- 1 else TableIndex$X <- 1:input$TheChoice
  })
  graphedTableData <- reactive({
    return(myTable[TableIndex$X,2])
  })
  dataSubset <- 
    reactive({
      print(paste0("calculating subset with ", length(TableIndex$X)," rows"))
      renderedData <- graphedTableData()
      renderedData2 <- melt(renderedData,id=rownames(renderedData))
      colnames(renderedData2)<-c("catone","cattwo","catthree")
      return(renderedData2)
    })
  output$thePlot <- renderPlot({
    print(paste0("Rendering Plot with ", length(TableIndex$X)," rows"))
    theSubset <- dataSubset()
    ggplot(data=theSubset,aes(x=catone,y=cattwo,colour=catthree)) + 
      geom_line()
  })
  output$validRows <- reactive({print("updating validRows");length(TableIndex$X)})

})
  1. 单击绘图输出选项卡:绘图渲染然后输出(使用一个数据行)
  2. 选择选项2:绘图渲染然后输出(使用两个数据行)
  3. 选择选择3:情节渲染,然后隐藏:(
  4. 选择选项4:没有渲染/输出(好)
  5. 现在在3到4之间,没有任何事情发生(好)

    通过查看控制台输出,您可以看到&#34; TableIndex&#34;首先更新,因此看起来这应该永远不会使用选项3渲染,因为绘图会在更新之前立即消失。据推测,该更新已经触发了reactive()和renderPlot()。

    如何阻止这些功能按此顺序执行?我知道我可以通过检查第一行中的TableIndex $ X来短路reactive()和renderPlot(),但这看起来很糟糕,我只是学习闪亮,所以我希望有一个更清洁的解决方案< / p>

    如果您实现渲染按钮的外观而不是为选项3和4显示任何内容,则会获得积分。我还没有尝试过,但我相信它会与renderUI()有关吗?

    (TableIndex是单独计算的,然后以这种方式访问​​,因为在现实生活中,它是从大表中找到相关索引,然后将这些相同的索引应用于其他表。假设索引查找速度很快)

0 个答案:

没有答案