我使用的是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,但是没有显示任何选项卡。我在做什么错了?
编辑: 添加了完整的最小可复制示例-仅显示主应用程序中的第一个选项卡和模块中的第二个选项卡。
答案 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,则需要在应用程序中包括这两个部分,否则模块将无法工作。
答案 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)