通过编辑表和/或eventReactive来更新handontable

Pat*_*cks 10 r handsontable shiny

rhandsontable在Shiny应用程序中使用该软件包,该应用程序应具有以下功能:

  • 计算中使用的数据可以随机生成,由actionButton(由应用程序启动时)调用
  • 用户可以通过掌上电脑手动编辑数据
  • 在手动编辑之后,应该可以重新生成随机数据,调用新的计算

以下应用程序完全符合我的要求,但我无法弄清楚如何摆脱全局变量did_recalc.这是一个最小的例子,其中数据由两个总结的数值组成.

library(shiny)
library(rhandsontable)

did_recalc <- FALSE

ui <- fluidPage(
  rHandsontableOutput('table'),
  textOutput('result'),
  actionButton("recalc", "generate new random vals and calculate")
)

server <- function(input,output,session)({

  dataset_generator <- eventReactive(input$recalc, {
    df <- as.data.frame(runif(2))
    output$table <- renderRHandsontable({rhandsontable(df)})
    did_recalc <<- TRUE
    df
  }, ignoreNULL = FALSE)

  output$result <- renderText({ 
    df <- dataset_generator()
    if (!is.null(input$table) && !did_recalc) 
      df <- hot_to_r(input$table)
    did_recalc <<- FALSE
    sum(df)
  })
}) 

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

如果我删除!did_recalc条件output$result <- ...然后编辑表仍然调用(正确)计算.但是如果按下"recalc"(在完成一些手动编辑之后),则"重新计算"按钮只会生成新的随机值,但不会重新计算总和.

在我看来,这input$table可以通过手动编辑表对象来改变,而不关心通过给出的新值renderRHandsontable.因此,我需要使用全局变量进行此操作,这允许我跟踪用户是否只是重新生成数据(导致input$table"过时")

有没有人知道如何在没有全局变量的情况下获得此示例的功能?

Nic*_*icE 15

您可以将数据存储在一个reactiveValues并有两个观察者更新它; 如果单击该按钮,则为一个,如果手动编辑该表,则为一个.

在你的output$tableoutput$result,你只需要使用在中的数据reactiveValues.这是一个例子(与ui.R您发布的相同):

server <- function(input,output,session)({
  values <- reactiveValues(data=as.data.frame(runif(2)))

  observe({
    input$recalc
    values$data <- as.data.frame(runif(2))
  })

  observe({
    if(!is.null(input$table))
     values$data <- hot_to_r(input$table)
  })


  output$table <- renderRHandsontable({
    rhandsontable(values$data)
    })


  output$result <- renderText({ 
    sum(values$data)
  })
}) 
Run Code Online (Sandbox Code Playgroud)