我知道renderPlot会生成可以在Shiny plotOutput函数上显示的绘图。我也知道autoinvalidate()有助于反应性地计算数据。
我正在使用以下代码显示雷达图表(实际上可以是任何图表):
output$plot2 <- renderPlot({
autoInvalidate()
p2<<-ggradar(mtcars_radar[i,])
})
我不知道如何在autoinvalidate()的每个事件期间将i的值从1更改为300。 或者无论如何我可以更改绘图中的数据行,以便绘图每秒动态动画一个新的数据行。 任何人都可以帮助我吗?
完整的代码在这里:
library(shiny)
library(ggplot2)
mtcars %>%
rownames_to_column( var = "group" ) %>%
mutate_at(vars(-group),funs(rescale)) %>%
tail(4) %>% select(1:10) -> mtcars_radar
ui <- fluidPage(
sidebarPanel(
actionButton("button", "Go!")
),
# Show the plot
mainPanel(
plotOutput("plot2")
)
)
server <- function(input, output) {
library(ggplot2)
library(ggradar)
suppressPackageStartupMessages(library(dplyr))
library(scales)
autoInvalidate <- reactiveTimer(2000)
plot2 <- NULL
output$plot2 <- renderPlot({
ggradar(mtcars_radar[1,])
})
observeEvent(input$button,{
output$plot2 <- renderPlot({
autoInvalidate()
p2<<-ggradar(mtcars_radar[i,])
p2
})
})
}
# Run the application
shinyApp(ui = ui, server = server)
请帮忙吗?
答案 0 :(得分:1)
这是您需要存储行索引并每秒更改的反应值的位置。我没有库ggradar
,所以我只打印出当前的行索引值。根据{{3}}的建议,我还使用了invalidateLater
代替reactiveTimer
。
library(shiny)
ui <- fluidPage(
verbatimTextOutput("debug")
)
server <- function(input, output) {
row_idx_max <- 15
row_idx <- reactiveVal(0)
observe({
isolate(row_idx(row_idx() + 1))
cur_row_idx <- isolate(row_idx())
if (cur_row_idx < row_idx_max) {
invalidateLater(1000)
}
})
output$debug <- renderPrint({
row_idx()
})
}
shinyApp(ui, server)