在一个闪亮的模块中创建多个选项卡

时间:2019-06-07 08:47:44

标签: r shiny shinymodules

我使用的是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)

我首先想知道为什么我不能简单地用逗号分隔两个选项卡。当我执行代码时,仅将我的第二个选项卡“ Result2”添加到tabsetPanel中。我也尝试使用tagList,但是没有显示任何选项卡。我在做什么错了?

编辑: 添加了完整的最小可复制示例-仅显示主应用程序中的第一个选项卡和模块中的第二个选项卡。

3 个答案:

答案 0 :(得分:2)

问题可能出在函数tabsetPanel使用其参数的方式上。 该功能希望tabPanels用逗号分隔。

在执行操作时,您需要在一个参数内提供两个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)

答案 1 :(得分:0)

此外,不确定模块应该执行什么操作,但不在服务器内部调用resultList,则需要在应用程序中包括这两个部分,否则模块将无法工作。

查看本文。 https://shiny.rstudio.com/articles/modules.html

答案 2 :(得分:0)

我通过在模块中定义多个UI功能找到了一个可行的解决方案。目的是模块将数据集作为输入并对其进行一些复杂的转换。然后,我想在第一个选项卡上显示一些可视化效果,并在第二个选项卡上具有一些downloadButtons。由于两个选项卡都引用相同的转换数据,因此我想将它们封装在同一模块中。下面的示例对我来说很好。我想知道这是不好的做法吗?

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)