miniUI:为miniTabstripPanel

时间:2016-02-19 15:05:19

标签: r shiny

我想使用miniUI创建一个Shiny小工具,它可以动态地为miniTabstripPanel添加额外的标签。但是,当我使用renderUI和uiOutput尝试时,我的实验中没有显示任何面板。我认为这与未正确设置的元素的高度(由我)有关。

无论如何,下面是一个最小的例子。如果我使用uiOutput()行,它不起作用。如果我反而注释掉并直接使用miniTabPanel()行,这是renderUI()中使用的确切代码,它工作正常。

library(shiny)
library(miniUI)

TSTAddin <- function() {
  panno <- 0
  ui <- miniPage(
    actionButton('btn_newPan', 'New Panel'),
    miniTabstripPanel(
#      miniTabPanel('pan1', miniContentPanel(height='100%', actionButton('Test','Test'))), miniTabPanel('pan2', miniContentPanel(height='100%', actionButton('Test','Test')))
      uiOutput('panelset')
    )
  )
  server <- function(input, output, session) {
    output$panelset <- renderUI({
      panno <<- panno+1
      txt <- paste0("miniTabPanel('pan", 1:panno, "', miniContentPanel(height='100%', actionButton('Test','Test')))", collapse=", ")
      list( eval(parse(text=txt)) )
    })
  }
  viewer <- paneViewer(300)
  runGadget(ui, server, viewer = viewer)
}

TSTAddin()

编辑:

mkemp6建议的代码解决了这个问题。但是,如果我现在在面板上包含一个按钮,则只显示其中的一部分。如何更正动态生成的面板的大小?下面是一个采用mkemp6代码的例子。

library(shiny)
library(miniUI)

TSTAddin2 <- function() {

  ui <- miniPage(
    actionButton("nTabs", "More Tabs"),
    actionButton("neg_nTabs", "Less Tabs"),
    uiOutput('panelset')
  )

  server <- function(input, output, session) {
    output$panelset <- renderUI({
      n <- seq(max(input$nTabs - input$neg_nTabs + 1, 1))
      miniTabList <- lapply(paste("Pan", n), function(x) miniTabPanel(x, actionButton('Test','Test')))
      do.call(miniTabstripPanel, miniTabList)
    })
  }

  viewer <- paneViewer(300)
  runGadget(ui, server, viewer = viewer)
}

TSTAddin2()

2 个答案:

答案 0 :(得分:0)

试试这个:

library(shiny)
library(miniUI)

TSTAddin <- function() {

  ui <- miniPage(
    actionButton("nTabs", "More Tabs"),
    actionButton("neg_nTabs", "Less Tabs"),
    uiOutput('panelset')
    )

  server <- function(input, output, session) {
    output$panelset <- renderUI({
      n <- seq(max(input$nTabs - input$neg_nTabs + 1, 1))
      miniTabList <- lapply(paste("Pan", n), miniTabPanel)
      do.call(miniTabstripPanel, miniTabList)
    })
  }

  viewer <- paneViewer(300)
  runGadget(ui, server, viewer = viewer)
}

TSTAddin()

答案 1 :(得分:0)

关于面板大小的第二个问题:

每当你使用uiOutput()时,有光泽会在渲染内容周围放置另一个div标签。如图所示,默认情况下,此内容的样式与miniUI元素不兼容。但是,这可以通过添加一些特定的CSS代码(我基本上从其他一些类的miniUI.css中复制)来纠正。

此外,当您在miniContenPanel中相互放置多个元素(在您的情况下:操作按钮)时,建议为每个元素创建单独的容器。您可以使用http://shiny.rstudio.com/articles/gadget-ui.html中描述的fillCol / fillRow轻松完成此操作。

此代码适用于我(您可能希望进一步改进布局):

library(shiny)
library(miniUI)

TSTAddin2 <- function() {

  ui <- miniPage(

    tags$head(
      tags$style(HTML("
        .ui-output-mini {position: absolute;top:0;right:0;bottom:0;left:0;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
      "))
    ),

    fillCol(flex=c(NA, NA, 1), 
      actionButton("nTabs", "More Tabs", width='100%'),
      actionButton("neg_nTabs", "Less Tabs", width='100%'),
      uiOutput('panelset', class='ui-output-mini')
    )
  )

  server <- function(input, output, session) {
    output$panelset <- renderUI({
      n <- seq(max(input$nTabs - input$neg_nTabs + 1, 1))
      miniTabList <- lapply(paste("Pan", n), function(x) miniTabPanel(x, actionButton('Test','Test')))
      do.call(miniTabstripPanel, miniTabList)
    })
  }

  viewer <- paneViewer(300)
  runGadget(ui, server, viewer = viewer)
}

TSTAddin2()