【问题标题】:Update dynamically created plot in R Shiny在 R Shiny 中更新动态创建的绘图
【发布时间】:2017-06-18 15:45:22
【问题描述】:

我使用动态创建 R Shiny 绘图和其他小部件

#ui.R
...
uiOutput("main_panel")
...

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

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

【问题讨论】:

  • 有机会给我一些反馈吗?

标签: r shiny


【解决方案1】:

我认为您希望能够在没有用户输入的情况下更新绘图。假设我是对的,您可以使用 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)

产量:

【讨论】:

  • 对我有什么反馈吗?
  • 非常好的例子,但这不是我要求的。
【解决方案2】:

我可以动态生成任何复合 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)
                   })
})

【讨论】:

  • 我仍然不清楚你想要什么。你能详细说明一下吗?这有什么不同使它成为正确答案?屏幕截图也有助于理解它。
猜你喜欢
  • 2022-01-24
  • 2016-12-21
  • 1970-01-01
  • 2014-04-19
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
相关资源
最近更新 更多