我有一个带有 ui 的 Shiny 应用程序,它由一个带有不同 tabPanel 的 navbarPage 组成。 在那些里面,我希望每个选项卡都有相同的按钮。所以每个选项卡都有相同的按钮,链接到相同的输入。
例如
ui <- navbarPage( theme = shinytheme("sandstone"),
tabPanel(title="number one",
fluidRow(column(2, wellPanel(
sliderInput("one", "slider_one", value =0, min = 0, max=500, step=10),
sliderInput("two", "slider_two", value =250, min = 0, max=1000, step=10),
)),
column(8,
dataTableOutput('totals')
))),
tabPanel(title="number two" ,
fluidRow(column(2, wellPanel(
sliderInput("one", "slider_one", value =0, min = 0, max=500, step=10),
sliderInput("two", "slider_two", value =250, min = 0, max=1000, step=10)
)),
column(8,
dataTableOutput('totals_2')),
)))
在代码的服务器部分,我有一些依赖于插入的输入的 react 值和一些依赖于 react 值的输出(具有不同的名称)。
是否可以只为 react 值编写一次代码,例如仅针对第一个 tabPanel 上的输入(因为它们对于两个面板都是相同的),或者我应该为每个 tabPanel 本身定义 react 值(在这种情况下,我还应该重命名输入,以便它们在每个选项卡面板)?
例如
server <- function(input, output) {
react <- reactive({some_function(input$one, input$two)})
output$totals<-renderDataTable({react()
})
output$totals_2<-renderDataTable({react()
})
}
所以它应该写成下面的内容。
ui <- navbarPage( theme = shinytheme("sandstone"),
tabPanel(title="number one",
fluidRow(column(2, wellPanel(
sliderInput("one", "slider_one", value =0, min = 0, max=500, step=10),
sliderInput("two", "slider_two", value =250, min = 0, max=1000, step=10),
)),
column(8,
dataTableOutput('totals')
))),
tabPanel(title="number two" ,
fluidRow(column(2, wellPanel(
sliderInput("one1", "slider_one", value =0, min = 0, max=500, step=10),
sliderInput("two2", "slider_two", value =250, min = 0, max=1000, step=10)
)),
column(8,
dataTableOutput('totals_2')),
)))
server <- function(input, output) {
react <- reactive({some_function(input$one, input$two)})
react2 <- reactive({some_function(input$one1, input$two2)})
output$totals<-renderDataTable({react()
})
output$totals_2<-renderDataTable({react2()
})
}
我认为这会写很多东西,尤其是当您有很多参数时。
最佳答案
我想出了一种方法,可以通过循环创建 n 个选项卡。
library(shiny)
library(tidyverse)
library(shinythemes)
##modify n_ui to change de number of tabs
n_ui <- 10
ui <- fluidPage(
uiOutput('repeated_tabs') ##uiOutput can eventually be extended to be reactive on users input to control the n of tabs from inside the app.
)
server <- function(input, output, session) {
##create unique index for ids in each tab
number_panel <- as.character(seq(1, n_ui))
output$repeated_tabs <- renderUI({
#map will create n tabPanel`s as specified in n_ui at the start of the script
tabs <- map(number_panel, ~
tabPanel(title = paste('Tab', .x),
fluidRow(
column(4,
wellPanel(
sliderInput(paste0('one', .x), "slider_one", value =0, min = 0, max=500, step=10),
sliderInput(paste0('two',.x), "slider_two", value =250, min = 0, max=1000, step=10),
)),
column(8,
dataTableOutput(paste0('totals', .x))
))) )
tabisize <- partial(navbarPage, title = 'n Tabs app', theme = shinytheme("sandstone"))
exec(tabisize, !!!tabs) #lets me pass each element in tabs as an individual argument (a loop wont do it, neither purrr::reduce())
})
#to acces tab1 'totals' output
output$totals1 <- renderDataTable({iris})
}
shinyApp(ui, server)
关于r - navbarPage、Shiny R 中不同 tabPanel 上的相同输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52201183/