R 在使用conditionalPanel隐藏之前进行打印渲染

R 在使用conditionalPanel隐藏之前进行打印渲染,r,shiny,R,Shiny,我有一个图形,我只想显示,如果它不会需要太长的时间来渲染,否则我想有一个按钮,用户可以按下渲染它。 我的问题是,在某些情况下,图形在隐藏之前进行渲染 打开这个复制最少的示例,然后尝试以下步骤 用户界面 服务器.r library(shiny) library(ggplot) library(reshape2) `[` <- function(...) base::`[`(...,drop=FALSE) myTable <- matrix(1:20,ncol=4) colnames(m

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

打开这个复制最少的示例,然后尝试以下步骤

用户界面

服务器.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)})

})
单击“打印输出”选项卡:打印渲染,然后使用一个数据行进行输出 选择选项2:打印渲染,然后使用两个数据行输出 选择选项3:打印渲染,然后隐藏: 选择选项4:没有渲染/输出良好 现在在3到4之间,没有什么好事发生

通过查看控制台输出,您可以看到TableIndex是首先更新的,因此似乎永远不应该使用选项3呈现,因为在更新之前绘图会立即消失。据推测,这一更新已经触发了反应和渲染图

如何防止这些函数按此顺序执行?我知道我可以通过检查第一行中的TableIndex$X来短路反应和渲染图,但这似乎有问题,我正在学习shiny,所以我希望有一个更干净的解决方案

如果您实现了渲染按钮的外观,而不是在选项3和4中不显示任何内容,则会获得额外的积分。我还没有尝试过,但我相信这会是renderUI的事


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

您的示例不起作用:当我单击plot output选项卡时,它显示ColNames中有错误我有相同的结果,还请指出运行代码需要哪些其他包。我想是ggplot2和2。对不起,我有`[`
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)})

})