【问题标题】:Unable to reset reactive rhandsontable observeEvent无法重置反应性 rhandsontable 观察事件
【发布时间】:2020-12-01 07:37:37
【问题描述】:

我使用 R 已经有一段时间了,但 R shiny 对我来说似乎完全是一门外语。

我有一个使用 rhandsontable 的 RShiny 应用程序,它从 rhandsontable 中的另一列和 rhandsontable 外部获取输入来计算新列。目前,当表中的任何条目被修改时,表确实会更新所有内容,但我想尽可能减少用户错误的风险,或者通过使 rhandsontable 对表内外的更改做出反应(首选) 或在单击按钮时重置。

下面的示例是从How to reset to default a reactive rhandsontable? 修改的,但重现了我的问题。一旦我为 rhandsontable 添加了一个 observeEvent,甚至在我调用外部输入之前,重置按钮就不再起作用了。

为了让 observeEvent 对外部输入的变化和表的变化都有反应,我试着做一个反应输入(例如,listener <- reactive(c(input$two_by_two$changes$changes, input$reset_input))),把它们都放在observeEvent(例如,input$two_by_two$changes$changes | input$reset_input)中,这样两者都会导致Warning: Error in do.call: second argument must be a list 错误。

library(shiny)
library(rhandsontable)

server <- shinyServer(function(input, output, session) {
  FACTOR <- reactive(input$factor_val)
  DF <- data.frame(A = c(1, 2), B = c(2, 4), row.names = c("C", "D"))
  DF1 <- reactiveValues(data=DF)
  output$two_by_two <- renderRHandsontable({
    input$reset_input 
    rhandsontable(DF1$data)
  })
  observeEvent(input$two_by_two$changes$changes,
               {DF1$data <- hot_to_r(input$two_by_two)
               DF1$data[,2] = DF1$data[,1]*FACTOR() }) })


ui <- shinyUI(fluidPage(
  actionButton(inputId = "reset_input", label = "Reset"),
  br(),
  numericInput("factor_val","Multiplier Value",min=0,max=10,value=2),
  rHandsontableOutput("two_by_two")
))

shinyApp(ui, server)

再次感谢您的帮助。

【问题讨论】:

    标签: r shiny rhandsontable


    【解决方案1】:

    您无法重置的原因是您更改了响应式数据框,但从未将其重置。我添加了一个新的观察事件来处理它。请看看这是不是你要找的。​​p>

    library(shiny)
    library(rhandsontable)
    
    server <- shinyServer(function(input, output, session) {
      FACTOR <- reactive(input$factor_val)
      DF <- data.frame(A = c(1, 2), B = c(2, 4), row.names = c("C", "D"))
      DF1 <- reactiveValues(data=DF)
      observeEvent(input$reset_input, {
        DF1$data <- DF
      })
      
      output$two_by_two <- renderRHandsontable({
        #input$reset_input
        rhandsontable(DF1$data)
      })
      observeEvent(input$factor_val, {
                   req(input$factor_val)
                   DF1$data <- hot_to_r(req({input$two_by_two}))
                   DF1$data[,2] = DF1$data[,1]*FACTOR()
                   })
    })
    
    ui <- shinyUI(fluidPage(
      actionButton(inputId = "reset_input", label = "Reset"),
      br(),
      numericInput("factor_val","Multiplier Value",min=0,max=10,value=2),
      rHandsontableOutput("two_by_two")
    ))
    
    shinyApp(ui, server)
    

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2019-03-31
      • 2018-11-28
      • 2017-04-24
      • 2016-09-14
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2017-07-14
      相关资源
      最近更新 更多