Используйте ConditionalPanel с DT: строки данных, выбранные в блестящих модулях - PullRequest
0 голосов
/ 08 февраля 2019

У меня проблема с преобразованием моего блестящего приложения в Shiny Modules.В моем приложении у меня есть ConditionalPanel, где условной является js-строка для DT: datatable_rows_selected.Я не понимаю, как мне нужно переписать это условие для работы с концепцией ShinyModule.

Пример: Это правильно работает (когда выбираются строки в таблице - открыт ConditionalPanel):

    library(shiny)
    library(DT)
    shinyApp(
      ui = fluidPage(
        DT::dataTableOutput("testTable"),
        conditionalPanel(condition = "typeof input.testTable_rows_selected  !== 'undefined' && input.testTable_rows_selected.length > 0",
                         verbatimTextOutput("two")                     
                         )
      ),
      server = function(input,output) {
        output$testTable <- DT::renderDataTable(mtcars, selection=list(mode="multiple",target="row"))
        output$two <- renderPrint(input$testTable_rows_selected) 
      }
    )

Но это не работа:

library(shiny)
library(DT)
testUI <- function(id) {
  ns <- NS(id)
  tagList(
            DT::dataTableOutput(ns("testTable")),
            conditionalPanel(condition = "typeof input.testTable_rows_selected  !== 'undefined' && input.testTable_rows_selected.length > 0",
                             verbatimTextOutput(ns("two"))
                            )
          )
}

test <- function(input,output,session) {
  ns <- session$ns
  output$testTable <- DT::renderDataTable(mtcars, selection=list(mode="multiple",target="row"))
  output$two <- renderPrint(input$testTable_rows_selected) 
  # return(reactive(input$testTable_rows_selected))
}

shinyApp(
  ui = testUI("one"),
  server = function(input,output) {
    out <- callModule(test,"one")
  }
)

1 Ответ

0 голосов
/ 11 февраля 2019

Очень странно, но не нужно создавать новое имя таблицы, как в предыдущем ответе.Правильный - установите параметр "ns" на условную панель и не трогайте js-строку для условия.Этот пример работает правильно:

library(shiny)
library(DT)

testUI <- function(id) {
  ns <- NS(id)

  tagList(
      fluidPage(
        DT::dataTableOutput(ns("one")),
        conditionalPanel( 
                          condition = "typeof input.one_rows_selected  !== 'undefined' && input.one_rows_selected.length > 0", 
                          ns=ns, 
                          verbatimTextOutput(ns("two"))
                         )
    )
  )
}

test <- function(input,output,session) 
{
  output$one <- DT::renderDataTable(mtcars, selection=list(mode="multiple",target="row"))
  output$two <- renderPrint(input$one_rows_selected) 
}

shinyApp(
  ui = testUI("p"),
  server = function(input,output,session) {  out <- callModule(test,"p")}
)
...