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

Posted

技术标签:

【中文标题】通过编辑表格和/或 eventReactive 来更新handsontable【英文标题】:Update handsontable by editing table and/or eventReactive 【发布时间】:2016-02-16 19:21:09 【问题描述】:

我在 Shiny 应用中使用 rhandsontable 包,它应该具有以下功能:

计算中使用的数据可以随机生成,由actionButton 调用(以及在应用启动时) 用户可以通过handsontable对象手动编辑数据 手动编辑后,应该可以重新生成随机数据,调用新的计算

以下应用完全符合我的要求,但我不知道如何摆脱全局变量 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)

如果我删除output$result &lt;- ... 中的!did_recalc 条件,那么编辑表格仍会调用(正确的)计算。但是如果按下“重新计算”(在完成一些手动编辑之后),那么“重新计算”按钮只会生成新的随机值,但不会重新计算总和。

在我看来,input$table 可以通过手动编辑表对象来更改,而不关心通过renderRHandsontable 给出的新值。因此,我需要这个带有全局变量的 hack,它允许我跟踪用户是否刚刚重新生成数据(导致 input$table 已“过时”)

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

【问题讨论】:

【参考方案1】:

您可以将数据存储在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)
  )
) 

【讨论】:

这是一个非常有用的例子......我想知道如何用另一个 UI 元素的结果替换硬编码的runif(2)。 ***.com/questions/33722757/…

以上是关于通过编辑表格和/或 eventReactive 来更新handsontable的主要内容,如果未能解决你的问题,请参考以下文章

Shiny:observeEvent 和 eventReactive 有啥区别?

是否可以在 Shiny 中将 eventReactive 用于超过 1 个 checkboxInput?

无法使用 observeEvent 和 eventReactive 更新闪亮应用程序中的输入

如何在 Shiny eventReactive 处理程序中侦听多个事件表达式

闪亮的R或两个输入过滤器

r闪亮:按下按钮时eventReactive没有反应