我有一个列表,其中包含多个相同格式的data.frames,使用这些data.frames,我想制作一个选项卡列表,将每个data.frame显示为DT::d atatable,并在下面绘制一个绘图,以下代码工作正常:
createTabs <- function(df) {
tabPanel(
renderDataTable(df),
renderPlotly(volcano_plot(df))
)}
myTabs <- lapply(myList, createTabs)
return(do.call(tabsetPanel,myTabs))
但是,这样我没有为每个 renderDataTable 对象分配输出 ID,以后如果我想让用户选择的行在数据表中执行一些统计信息,就像这个一样
如何从筛选的数据表 (DT( 的选定行中获取数据?
这是不可能的,因为我无法获得这些数据表的输出 ID,我想知道当我使用 renderDataTable(( 创建时是否有办法为每个数据表分配一个输出 ID,或者还有其他方法?欢迎任何想法!
您可以先构造输出对象(以便可以命名它们(,然后在创建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
实际上是反应式的,则应在两个lapply
语句周围环绕一个observer
。希望这有帮助!