Shiny modal 中的handsontable 无法正确渲染

Posted

技术标签:

【中文标题】Shiny modal 中的handsontable 无法正确渲染【英文标题】:handsontable in Shiny modal does not render properly 【发布时间】:2019-03-12 20:24:50 【问题描述】:

问题

在我的代码中,我想在modal 中显示rhandsontable。当我第一次显示模态时,表格很好地呈现。但是,当我关闭模式并重新打开它(不更改基础数据)时,我只能看到表格的一部分。只有在我点击表格后,它才能再次正确呈现。如果数据在重新打开 modal 之前发生变化,表格会再次很好地呈现。

问题

我怎样才能避免这种情况?是否有一个 javascript 例程我可以调用以强制 handsontable 重新渲染作为解决方法?

Reprex

library(shiny)
library(rhandsontable)

ui <- fluidPage(actionButton("show", "show"), 
                actionButton("change", "Change"))

server <- function(input, output, session) 
  dat <- reactiveVal(data.frame(x = runif(2), 
                                y = runif(2)))

  observeEvent(input$show, 
    showModal(modalDialog(rHandsontableOutput("hot")))
  )

  observeEvent(input$change, dat(data.frame(x = runif(2), 
                                            y = runif(2))))

  output$hot <- renderRHandsontable(rhandsontable(dat()))

如何重现错误

    打开和关闭模式 重新打开模态框,你会看到它也没有正确渲染 再次关闭并刷新数据 重新打开模态框,看到它再次正确呈现

截图

环境

R version 3.5.0 (2018-04-23)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 7 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252   
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] shiny_1.1.0         rhandsontable_0.3.6

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.17    digest_0.6.15   later_0.7.2     mime_0.5       
 [5] R6_2.2.2        xtable_1.8-2    jsonlite_1.5    magrittr_1.5   
 [9] rlang_0.2.1     promises_1.0.1  tools_3.5.0     htmlwidgets_1.2
[13] httpuv_1.4.3    yaml_2.1.19     compiler_3.5.0  htmltools_0.3.6

浏览器测试:Chrome 版本 69.0.3497.100,IE 11

【问题讨论】:

对我来说似乎是一个错误。使用 outputOptions(output, "hot", suspendWhenHidden=F) 没有帮助。我认为已经有一个github issue。 【参考方案1】:

不是最优雅的解决方案,但这是可行的:

library(shiny)
library(rhandsontable)

ui <- fluidPage(actionButton("show", "show"), 
                actionButton("change", "Change"))

server <- function(input, output, session) 
  dat <- reactiveVal(data.frame(x = runif(2), 
                                y = runif(2)))

  dat1 <- reactive(
    if(is.null(input$hot))
      dat()
     else 
      as.data.frame(hot_to_r(input$hot))
    
  )

  observeEvent(input$show, 
    showModal(modalDialog(rHandsontableOutput("hot")))
  )

  observeEvent(input$change, 
               dat(data.frame(x = runif(2), y = runif(2))))

  output$hot <- renderRHandsontable(rhandsontable(dat1()))



shinyApp(ui,server)

【讨论】:

这个解决方案并不完全有效。 “更改”操作按钮不起作用(它不会重置表格),而原始发​​布代码中的“更改”按钮确实起作用。

以上是关于Shiny modal 中的handsontable 无法正确渲染的主要内容,如果未能解决你的问题,请参考以下文章

Shiny:Shiny Dashboard (sidebarMenu) 中的 renderMenu 和 observeEvent 冲突

R 中 Shiny 中的时间序列预测; Shiny 显示 unix 纪元时间

无法在 Linux VM 中的 Shiny 服务器上部署 Shiny 应用程序

Shiny 中的只读指示器?

Shiny R中的条件格式多个表

R/Shiny App 将绘图写入 RStudio 中的绘图视图而不是 Shiny UI