Помещение данных в модалос - PullRequest
0 голосов
/ 01 мая 2018

Я использую Shiny с библиотекой Shiny Semantic, чтобы приложение выглядело красиво. Стандартное всплывающее сообщение Shiny, использующее showModal (modalDialog ()), не работает с семантическим пользовательским интерфейсом, поэтому я прибегнул к smoothjs, чтобы использовать некоторые 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))

1 Ответ

0 голосов
/ 07 марта 2019

У меня была такая же проблема сегодня, и мне удалось найти способ ее решить. Когда модальное окно открывается в 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))
...