我有一个图表,如果渲染时间不长,我只想显示,否则我想要一个按钮,用户可以按下来渲染它。 我的问题是图形在某些情况下隐藏之前呈现。
打开此最低限度复制的示例并尝试以下步骤
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)})
})
现在在3到4之间,没有任何事情发生(好)
通过查看控制台输出,您可以看到&#34; TableIndex&#34;首先更新,因此看起来这应该永远不会使用选项3渲染,因为绘图会在更新之前立即消失。据推测,该更新已经触发了reactive()和renderPlot()。
如何阻止这些功能按此顺序执行?我知道我可以通过检查第一行中的TableIndex $ X来短路reactive()和renderPlot(),但这看起来很糟糕,我只是学习闪亮,所以我希望有一个更清洁的解决方案< / p>
如果您实现渲染按钮的外观而不是为选项3和4显示任何内容,则会获得积分。我还没有尝试过,但我相信它会与renderUI()有关吗?
(TableIndex是单独计算的,然后以这种方式访问,因为在现实生活中,它是从大表中找到相关索引,然后将这些相同的索引应用于其他表。假设索引查找速度很快)