Принудительное извлечение скрытой таблицы

#r #shiny #rhandsontable #shinybs

#r #блестящий #rhandsontable #shinybs

Вопрос:

У меня есть следующее приложение, которое представляет собой просто панель свертывания, содержащую rhandsontable таблицу.

 library(shiny)
library(shinyBS)
library(rhandsontable)

ui <- function() {
  fluidPage(
    bsCollapsePanel(
      "Test",
      rHandsontableOutput("table")
    )
  )
}

server <- function(input, output, session) {
  output$table <- renderRHandsontable({
    rhandsontable(
      data.frame(
        a = 1:2,
        b = 2:3
      )
    )
  })
}

shinyApp(ui, server)
  

Это работает, как и ожидалось: панель начинается со скрытого содержимого, и если мы щелкнем по ней, откроется панель, и мы увидим таблицу.

Однако между открытием панели и появлением таблицы наблюдается заметная «задержка». Я предполагаю, что это связано с тем, что таблица до этого не была инициализирована, и поэтому вся работа по фактическому созданию таблицы происходит только в этот момент.

Если мы затем закроем панель и снова откроем ее, такой задержки не будет, и мы даже сможем постепенно просматривать таблицу по мере повторного открытия панели.

Я не знаю, является ли это особенностью или ошибкой, или кто «виноват» в этом: rhandsontable , за то, что ленился запускать? shinyBS , за то, что ленился запускать его содержимое? shiny в общем, только для немедленного запуска перерисовки, когда это необходимо? Я бы предположил, что это так rhandsontable , поскольку более базовые элементы, такие как textInput() , не имеют этой проблемы, но не могут знать наверняка.

Итак, есть ли способ принудительно выполнить эту инициализацию таблицы при запуске приложения, а не только при расширении панели?

Я думал о том, чтобы настроить панель на запуск open, а затем взломать сервер, чтобы закрыть панель при запуске, но я не совсем уверен, как это будет работать … или если это вообще сработает (если он закроется до первой перерисовки, какая разница? если это после первой перерисовки, это будет означать мерцание при запуске, верно?).

Ответ №1:

Я думаю, это должно сработать:

 server <- function(input, output, session) {
  output$table <- renderRHandsontable({
    rhandsontable(
      data.frame(
        a = 1:2,
        b = 2:3
      )
    )
  })
  outputOptions(output, "table", suspendWhenHidden = FALSE)
}
  

Комментарии:

1. Да, это делает это. Или, ну, это решает эту конкретную проблему. К сожалению rhandsontable , перерисовка портится и изначально отображается только один из столбцов ( изображение ); щелчок по таблице вызывает вторую перерисовку, которая решает ее ( изображение ). Но это отдельная проблема (она ведет себя так же при изменении размера окна), поэтому я задам ее по отдельному вопросу.