r - R Shiny 使用反应值激活操作按钮两次
问题描述
我有以下闪亮的应用程序
server <- function(input, output, session) {
rv <- reactiveValues(i = 0)
output$myplot <- renderPlotly({
dt = data.frame(x = 1:10, y = rep(rv$i,10))
plot_ly(dt, x = ~x, y =~y)
})
observeEvent(input$run,{
rv$i <- 0
observe({
isolate({rv$i = rv$i + 1})
if (rv$i < 10){invalidateLater(1000, session)}
})
})
}
ui <- fluidPage(
actionButton("run", "START"),
plotlyOutput("myplot")
)
shinyApp(ui = ui, server = server)
操作按钮一次就可以正常工作:如果我点击它,情节就会更新。但问题是我无法单击它两次,因为它会使应用程序崩溃。
我希望这样,每次单击操作按钮时, rv$i 的值都会恢复为 0,并且动画会重新开始。
解决方案
把一个观察者放在另一个观察者里面并不是一个好主意。只需将内部观察者放在外面,它就会起作用。
library(shiny)
library(plotly)
server <- function(input, output, session) {
rv <- reactiveValues(i = 0)
output$myplot <- renderPlotly({
dt = data.frame(x = 1:10, y = rep(rv$i,10))
plot_ly(dt, x = ~x, y =~y, mode = "markers", type = 'scatter')
})
observeEvent(input$run,{
rv$i <- 0
})
observe({
isolate({rv$i = rv$i + 1})
if (rv$i < 10){invalidateLater(1000, session)}
})
}
ui <- fluidPage(
actionButton("run", "START"),
plotlyOutput("myplot")
)
shinyApp(ui = ui, server = server)
推荐阅读
- c# - 生成全球唯一的哈希
- java - 如何使用 Java 在 Apache Flink 中对 DataStream 执行平均操作
- php - 有没有办法在不遍历所有数组的情况下从关联数组中获取值?
- java - 如果将 (required=false) 与 autowired 一起使用,@Autowired 和 @Qualifier 将不起作用
- javascript - 添加 if/else 语句后游戏组件不会绘制
- node.js - Heroku 部署错误(404 未找到:websocket-driver@0.7.2)
- python - 将 response.text 保存为 PDF
- angular - 自定义样式以在角度 6 上对元素进行条带化,不影响 UI
- javascript - 如何将文本区域中突出显示的文本提交到数据库中
- angular - 如果分配了单击侦听器,则在组件中检测 Angular 2+