更新R Shiny中动态创建的绘图

时间:2017-01-03 07:49:09

标签: r shiny

我使用

动态创建R Shiny图和其他小部件
#ui.R
...
uiOutput("main_panel")
...

#server.R
output$main_panel <- renderUI({ 
                              mainPanel(renderPlot({...}), ..., ...)
                              })

这很好用,但是可以在不更改其他动态生成的小部件的情况下更新动态生成的绘图吗?我发现的所有示例都是静态生成的小部件。 (我也有兴趣如何使动态创建的小部件可点击等等。)

2 个答案:

答案 0 :(得分:2)

我认为您希望能够在没有用户输入的情况下更新绘图。假设我是对的,你可以使用reactiveTimer异步更新它,就像这个为分布添加一个点的样本,然后每半秒更新一次。

library(shiny)

ui <- fluidPage(
  sidebarLayout(position = "left",
                sidebarPanel("Controls",
                  actionButton("gogobutt","Go"),
                  actionButton("stopbutt","Stop"),
                  actionButton("resetbutt","Reset")),

                mainPanel("Plot",
                          plotOutput("histplot")
                          )
))
server <- function(input,output,session) {
   rv <- reactiveValues(x=rnorm(1),run=F)

   autoInvalidate <- reactiveTimer(intervalMs=500,session)

   observe({
     autoInvalidate()
     isolate({ if (rv$run) { rv$x <- c(rv$x,rnorm(1)) } })
   })

   observeEvent(input$gogobutt, { isolate({ rv$run=T      }) })
   observeEvent(input$stopbutt, { isolate({ rv$run=F      }) })
   observeEvent(input$resetbutt,{ isolate({ rv$x=rnorm(1) }) })

   output$histplot <- renderPlot({
    htit <- sprintf("Hist of %d rnorms",length(rv$x))
    hist(rv$x,col = "steelblue",main=htit,breaks=12)
  })
}
shinyApp(ui, server)

产量:

enter image description here

答案 1 :(得分:1)

我可以动态生成任何复合ui,因为我可以动态创建命名输入和输出,然后像往常一样响应事件。

#ui.R
library(shiny)

# Define UI for application that plots random distributions 
shinyUI(pageWithSidebar(

  headerPanel("Example"),

  # Sidebar with a slider input for number of observations
  sidebarPanel(
     checkboxInput("show_dynamic_ui", label="Show dynamic UI", value=TRUE)
  ),

  # Show a plot of the generated distribution
  mainPanel(
     uiOutput("dynamic_ui")
  )
))

#server.R
library(shiny)

shinyServer(function(input, output, session) {

    output$dynamic_ui <- renderUI({
        if (input$show_dynamic_ui) #NULL when not checked
            fluidPage(
                fluidRow(column(6, sliderInput("dinput", "Number of observations:",min=1, max=1000, value=500))),
                fluidRow(column(12, plotOutput("dplot")))
            )
    })

    output$dplot<-renderPlot({
                       dist <- rnorm(as.integer(input$dinput))
                       hist(dist)
                   })
})