我使用
动态创建R Shiny图和其他小部件#ui.R
...
uiOutput("main_panel")
...
#server.R
output$main_panel <- renderUI({
mainPanel(renderPlot({...}), ..., ...)
})
这很好用,但是可以在不更改其他动态生成的小部件的情况下更新动态生成的绘图吗?我发现的所有示例都是静态生成的小部件。 (我也有兴趣如何使动态创建的小部件可点击等等。)
答案 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)
产量:
答案 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)
})
})