Я использую Shiny с библиотекой Shiny Semantic, чтобы приложение выглядело красиво. Стандартное всплывающее сообщение Shiny с использованием showModal (modalDialog ()) не работает с семантическим пользовательским интерфейсом, поэтому я обратился к shinyjs, чтобы использовать некоторый javascript, чтобы разрешить модальные окна. Когда модальное окно js определено глобально, как мне интегрировать объект данных в модальное окно? Вот минимальный пример:
library(shiny)
library(shinyjs)
library(shiny.semantic)
library(DT)
modal.js = "$('.ui.modal')
.modal('show')
;"
server <- function(input, output, session) {
output$my_table = DT::renderDataTable({
head(iris)
})
observeEvent(input$open_modal, {
runjs(modal.js)
})
}
ui <- semanticPage(
suppressDependencies("bootstrap"),
useShinyjs(),
div(class = "ui modal",
div(class = "header", 'Modal header'),
p('Placing DT::dataTableOutput("my_table") here fails.
If it was displayed, I would select a row and return the value to a reactiveValue.')
),
div(class = "ui basic button action-button", id = "open_modal", "Open modal ui"),
div(class = "ui raised segment", DT::dataTableOutput("my_table"))
)
shinyApp(ui, server, options = list(launch.browser = TRUE))
Сегодня у меня была такая же проблема, и мне удалось найти способ ее решить. Когда модальное окно открывается в shiny.semantic
, вывод данных по-прежнему классифицируется как невидимый. Чтобы исправить это, вам просто нужно добавить дополнительную строку в JavaScript:
$('#my_table').show().trigger('shown');
Вам нужно будет добавить еще несколько JS, если вы хотите снова скрыть его при закрытии, но это может быть лучше в пользовательском интерфейсе, используя tags$script()
, а не на сервере.
Обновленное приложение:
library(shiny)
library(shinyjs)
library(shiny.semantic)
library(DT)
modal.js <- "$('.ui.modal').modal('show');
$('#my_table').show().trigger('shown');"
server <- function(input, output, session) {
output$my_table = DT::renderDataTable(head(iris))
observeEvent(input$open_modal, runjs(modal.js))
}
ui <- semanticPage(
suppressDependencies("bootstrap"),
useShinyjs(),
div(
class = "ui modal",
div(class = "header", "Modal header"),
div(class = "content", div(class = "ui raised segment", DT::dataTableOutput("my_table")))
),
div(class = "ui basic button action-button", id = "open_modal", "Open modal ui")
)
shinyApp(ui, server, options = list(launch.browser = TRUE))
Поместите в свой dataTableOutput
output$my_table = DT::renderDataTable({
datatable(head(iris), class = "compact", escape = FALSE) })