我想使用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()
答案 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()