我有一个列表,其中包含几个相同格式的data.frames,这些data.frames我想制作一个tablist,将每个data.frame显示为一个DT :: datatable,并在其中显示一个下面,以下代码工作正常:
createTabs <- function(df) {
tabPanel(
renderDataTable(df),
renderPlotly(volcano_plot(df))
)}
myTabs <- lapply(myList, createTabs)
return(do.call(tabsetPanel,myTabs))
然而,这种方式我没有为每个renderDataTable对象分配输出ID,稍后如果我想让用户选择的行在数据表中进行一些统计,就像在这个中一样
How do I get the data from the selected rows of a filtered datatable (DT)?
这是不可能的,因为我无法获得这些数据表的输出id,我想知道当我使用renderDataTable()创建时,是否有为每个数据表分配输出ID的方法已经或者还有其他方式吗?欢迎任何想法!
答案 0 :(得分:1)
您可以先构造输出对象(以便命名它们),然后在创建service.ranking:Integer
时调用它们。工作示例:
tabsetPanel
现在您也可以调用他们选择的行,因为数据表已命名。如果library(shiny)
library(plotly)
ui <- fluidPage(
uiOutput('my_tabsetpanel')
)
server <- function(input, output, session) {
myList = list('dt_1'= head(mtcars,5), 'dt_2' = head(mtcars,5), 'dt_3'= head(mtcars,5))
# create the tables
lapply(seq_along(myList),function(x) {
output[[names(myList)[x]]] = renderDataTable({myList[[x]]})
})
# create the plots
lapply(seq_along(myList),function(x) {
output[[paste0(names(myList)[x],'_plot')]] = renderPlotly({plot_ly(myList[[x]],x=~mpg,y=~cyl)})
})
# create tabsetPanel
output$my_tabsetpanel <- renderUI({
myTabs = lapply(seq_along(myList), function(x)
{
tabPanel(paste0('mytab',x),
dataTableOutput(names(myList)[x]),
plotlyOutput(paste0(names(myList)[x],'_plot')))}
)
do.call(tabsetPanel, myTabs)
})
}
shinyApp(ui, server)
实际上是被动的,则应在MyList
两个observer
语句周围包含lapply
。希望这有帮助!