#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
, перерисовка портится и изначально отображается только один из столбцов ( изображение ); щелчок по таблице вызывает вторую перерисовку, которая решает ее ( изображение ). Но это отдельная проблема (она ведет себя так же при изменении размера окна), поэтому я задам ее по отдельному вопросу.