r - 在invalidatelat观察者内增加reactivevalue

标签 r shiny invalidation

我正在尝试构建shinyapp来进行一个非常简单的测验。我有一个包含 10 个问题的 data.frame,用户点击回答 0 或 1。 它一直有效,直到我尝试使用 invalidateLater() 调用实现计时器/ 倒计时,以便在 5 秒后自动出现下一个问题。

当前问题编号存储在reactiveValues()对象中,变量i

当我添加观察功能时,应用程序停止工作并且不显示问题。我的代码在这里:

init = data.frame(question=paste("question", 1:10), correct=c(1,1,1,1,1,0,0,0,0,0), answer=NA, stringsAsFactors = FALSE)
library(shiny); library(shinydashboard)
ui=dashboardPage(dashboardHeader(title = "questionnaire"),dashboardSidebar(),dashboardBody(
        fluidRow(box(width = 6, title="how it works..", p("balblabla"))),
        fluidRow(
            box(width = 12, background = "orange",
          fluidRow(
            box(width = 12, 
                verbatimTextOutput("question"),
                tags$head(tags$style("#question{font-size: 20px; text-align: left; font-weight: bold;}"))
            ),
            box(width = 12,
                actionButton("negative", "answer 0", width = '30%'),
                actionButton("positive", "answer 1", width = '30%')
            ))))))
server <- function(input, output, session) {
  vals = reactiveValues(df = init, i=1)
  output$question <- renderText({vals$df[vals$i, "question"]})
  observe({
    invalidateLater(5000)
    vals$i <- vals$i + 1
  })
  observeEvent(input$negative, ignoreInit=TRUE, {
    vals$df[vals$i, "answer"] = 1
    if (vals$df[vals$i, "correct"]==1){
      showNotification("WRONG!", type="error", duration=1, closeButton = FALSE)
    } else {
      showNotification("CORRECT!", type="message", duration=1, closeButton = FALSE)
    }})
  observeEvent(input$positive, ignoreInit=TRUE, {
    vals$df[vals$i, "answer"] = 1
    if (vals$df[vals$i, "correct"]==0){
      showNotification("WRONG!", type="error", duration=1, closeButton = FALSE)
    } else {
      showNotification("CORRECT!", type="message", duration=1, closeButton = FALSE)
    }})
}
shinyApp(ui, server)

你能帮我修复这个观察语句吗,我不知道这里出了什么问题。

最佳答案

您需要隔离此观察者内索引的增量:

  observe({
    invalidateLater(5000)
    vals$i <- vals$i + 1
  })

,否则您将在无限循环中发送它,因为它“观察”的值在观察者本身内发生了变化,无论耗时如何,都会不断触发重新评估(您可以通过添加 print 来验证这一点(vals$i) 指令位于当前代码中,位于观察者末尾。

所以,这样的事情似乎有效:

  vals = reactiveValues(df = init, i=0)
  output$question <- renderText({vals$df[vals$i, "question"]})
  observe({
    invalidateLater(5000)
    isolate(vals$i <- vals$i + 1)
  })

请注意,我将 i 的初始化更改为零,以避免在初始化时跳过问题。

HTH。

关于r - 在invalidatelat观察者内增加reactivevalue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54364680/

相关文章:

r - 为什么在不附加zoo的情况下xts函数无法找到as.yearmon函数?

r - 删除向量中的特定元素组?

r - 有没有办法在 R Shiny 应用程序加载时自动验证对 GoogleSheets 的访问? Googlesheets4 身份验证问题

iphone - NSTimer 没有停止

JavaFX 属性的 invalidate() 方法未通过绑定(bind)调用

r - 如何在facet_grid中指定列或如何更改facet_wrap中的标签

r - 在 R Shiny 输入中按 Enter 键选择多个搜索关键字项目

r - 将颜色与 ggplot2 中的因素配对

android - 从(子)PreferenceScreen 返回时更新 PreferenceActivity 中现有的 Preference-item

r - grid.arrange :input must be grobs 出错