Создать несколько вкладок в одном блестящем модуле - PullRequest
0 голосов
/ 07 июня 2019

Я использую tabsetPanel и теперь хочу создать модуль, который добавляет более одной вкладки к этой панели.Вот мой пример кода:

library(shiny)
library(tidyverse)

resultlistUI <- function(id) {
  ns <- NS(id)
  tabPanel(
    title = "Result1",
    "Some text here 2"
  )
  tabPanel(
    title = "Result2",
    "Some text here 3"
  )
}

resultlist <- function(input, output, session) {
}

ui <- fluidPage(
  tabsetPanel(
    id = "tabs",
    tabPanel(
      title = "Tab 1",
      "Some text here"
    ),
    resultlistUI(id = "resultlist1")
  )
)

server <- function(input, output, session) {
}


shinyApp(ui = ui, server = server)

Сначала мне было интересно, почему я не могу просто разделить две вкладки запятой.Когда я выполняю код, в tabsetPanel добавляется только моя вторая вкладка «Result2».Я также попытался использовать tagList, но тогда ни одна из вкладок не была показана.Что я делаю не так?

РЕДАКТИРОВАТЬ: Добавлен полный минимальный воспроизводимый пример - отображаются только первая вкладка из основного приложения и вторая вкладка из модуля.

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Возможно, проблема связана с тем, что функция tabsetPanel использует свои аргументы. Функция хочет разделить табличные панели запятыми.

Делая то, что вы делаете, вы предоставляете две tabPanels в пределах одного аргумента.

Итак, вам нужно придумать что-то, что позволит вам предоставить одну вкладку на аргумент. Вернув список из вашего модуля и используя функцию do.call, вы можете добиться этого.

library(shiny)
library(tidyverse)

resultlistUI <- function(id) {
  ns <- NS(id)
  list(
    tabPanel(
      title = "Result1",
      "Some text here 2"
    ),
    tabPanel(
      title = "Result2",
      "Some text here 3"
    ))
}


resultlist <- function(input, output, session) {
}


ui <- fluidPage(

  do.call(tabsetPanel, 
          list(id = 'tabs', 
               tabPanel(
                 title = "Tab 1",
                 "Some text here"
               )) %>% append(resultlistUI(id = "resultlist1")))

)

server <- function(input, output, session) {
}


shinyApp(ui = ui, server = server)
0 голосов
/ 11 июня 2019

Я нашел рабочее решение, определив несколько UI-функций в модуле.Цель состоит в том, чтобы модуль взял набор данных в качестве входных данных и провел с ним несколько сложных преобразований.Затем я хочу отобразить некоторые визуализации на первой вкладке и несколько кнопок загрузки на второй вкладке.Поскольку обе вкладки ссылаются на одни и те же преобразованные данные, я хочу инкапсулировать их в один и тот же модуль.Пример ниже работает хорошо для меня.Интересно, это плохая практика?

library(shiny)
library(tidyverse)

## module start
results_1_UI <- function(id) {
  ns <- NS(id)
  tabPanel(
    title = "Plot",
    plotOutput(ns("testplot"))
  )
}
results_2_UI <- function(id) {
  ns <- NS(id)
  tabPanel(
    title = "Export",
    downloadButton(ns("download_data"), "Download")
  )
}

results <- function(input, output, session, data) {
  ## do some complicated data transformations
  data_transformed <- data

  output$testplot <- renderPlot(
    {
      data_transformed %>%
        ggplot(aes(x = Sepal.Length, y = Sepal.Width)) +
        geom_point()
    })
  output$download_data <- downloadHandler(
    filename = function() {
      paste("data_", Sys.time(), ".csv", sep = "")
    },
    content = function(file) {
      write.csv(data_transformed, file, row.names = FALSE, quote = FALSE, na = "", fileEncoding = "latin1")
    },
    contentType = "text/csv"
  )
}
### module end

ui <- fluidPage(
  tabsetPanel(
    id = "tabs",
    tabPanel(
      title = "Tab 1",
      "Some text here"
    ),
    results_1_UI(id = "test1"),
    results_2_UI(id = "test1")
  )
)

server <- function(input, output, session) {
  callModule(
    module = results,
    id = "test1",
    data = iris
  )
}


shinyApp(ui = ui, server = server)
0 голосов
/ 11 июня 2019

Кроме того, вы не знаете, что должен делать ваш модуль, но вы не вызываете resultList внутри сервера, вам нужно включить обе части в ваше приложение, иначе модуль не будет работать.

Проверьте эту статью. https://shiny.rstudio.com/articles/modules.html

...