在 R Shiny 中,如何使用 actionButton 重置 rhandsontable 中的数据(反转所有手动输入)?

Posted

技术标签:

【中文标题】在 R Shiny 中,如何使用 actionButton 重置 rhandsontable 中的数据(反转所有手动输入)?【英文标题】:In R Shiny, how do you reset data (reversing all manual inputs) in rhandsontable using an actionButton? 【发布时间】:2021-09-30 09:36:39 【问题描述】:

在下面的 MWE 代码中,操作按钮“显示”触发了一个模式对话框,其中包含用户可以使用 rhandsontable 操作的表格。按预期工作,但“重置”按钮不起作用。重置应该将所有用户输入反转到表中,并带回一个 2 列、5 行的随机变量表。

如何重置表格?今天早上我一直在玩这个,但还没有运气。

这个需要顺便留在modalDialog!模式对话框中的 Rhandsontable 看起来很棘手,但对于这个具有许多输入的模型来说,它的功能非常强大。

查看底部的图片。第一张图片显示了首次调用应用程序并单击“显示”操作按钮时发生的情况。好 - 出现一个 5 行 2 列的表格。第二张图片是用户右键单击表格以在底部插入额外的行,在第 6 行的 x 和 y 列中输入 6 后显示的内容。如果您单击以“关闭”模式并再次单击“显示”,那么很好——按预期显示相同的修改表。反复单击 Dismiss/Show 会不断返回相同的修改后的 6 行表——好!但是如果你点击“重置”,第 6 行添加的修改表会不断返回。应该恢复为 5 行表。如果用户手动在表中输入了很多行,而不是像本例中那样只输入了一行,reset 应该会返回一个 5 行的表。

library(shiny)
library(rhandsontable)

ui <- fluidPage(actionButton("show","Show"), 
                actionButton("reset","Reset"))

server <- function(input, output, session)
  
  dat <- reactiveVal(data.frame(x=runif(5),y=runif(5)))
  
  dat1 <- reactive(
    if(is.null(input$hot))dat() 
    else as.data.frame(hot_to_r(input$hot))
  ) # close reactive
  
  observeEvent(input$show,showModal(modalDialog(rHandsontableOutput("hot"))))
  
  observeEvent(input$reset,dat(data.frame(x=runif(5),y=runif(5))))
  
  output$hot <- renderRHandsontable(rhandsontable(dat1()))
  
 # close Server

shinyApp(ui,server)

下面是一张图片,显示了对它进行更改并点击“显示”按钮后被遮挡的表格(应该显示整个表格):

【问题讨论】:

【参考方案1】:

您的状况if(is.null(input$hot))dat() 阻止了重置。

请检查以下内容:

library(shiny)
library(rhandsontable)

ui <- fluidPage(actionButton("show", "Show"),
                actionButton("reset", "Reset"))

server <- function(input, output, session) 
  dat <- reactiveVal(data.frame(x = runif(5), y = runif(5)))
  
  observeEvent(input$hot, 
    dat(as.data.frame(hot_to_r(input$hot)))
  )
  
  observeEvent(input$show, 
    showModal(modalDialog(rHandsontableOutput("hot")))
  )
  
  observeEvent(input$reset, 
    dat(data.frame(x = runif(5), y = runif(5)))
  )
  
  output$hot <- renderRHandsontable(
    # input$show
    rhandsontable(dat())
  )
  
 # close Server

shinyApp(ui, server)

【讨论】:

从技术上讲它是有效的。但是现在,当您在更改表格后单击“显示”时,模态对话框中只会出现表格的一部分。要使整个表格出现,您必须单击表格上的任意位置。有什么办法可以在不丢失表格的完整呈现的情况下解决这个问题? 我们可以通过单击show 后重新渲染表格来解决此问题。在您的示例中可以在短时间内看到相同的效果 - 可能是 rhandsontable 中的错误。请查看我的编辑。 但现在重置已停止工作。嗯...确实看起来有问题 是的 - 这里有些奇怪。你可能想file an issue。 链接到相关的 GitHub 问题:github.com/jrowen/rhandsontable/issues/387

以上是关于在 R Shiny 中,如何使用 actionButton 重置 rhandsontable 中的数据(反转所有手动输入)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ui.R 中读取 TextInput,在 global.R 中使用此值处理查询并使用 Shiny 在 server.R 中显示

如何在 r shiny 中使用 JS 数据表 API?

如何使用操作按钮在 R Shiny 中显示和隐藏表格输出?

在 R Shiny 中使用 DT::renderDataTable 时如何抑制行名?

如何在 Shiny 中引用 ui.R 中的反应元素

如何在 R Shiny 中使用变量名访问辅助输入?