r语言 - 将输出 ID 分配给 renderdataTable() 对象在 lapply in shiny



我有一个列表,其中包含多个相同格式的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。希望这有帮助!

相关内容

最新更新