表头和表体的独立反应元素

时间:2014-02-06 17:02:50

标签: r shiny

在Shiny / R中,我想独立更新表格主体和表格标题。考虑这个例子:

library( shiny )
tt <- read.table( text="  id      blah       foo
1  1      adsf foo1
2  2      ioiu foo2
3  3 ioiuoiuer foo3", stringsAsFactors= F ) 

runApp( list( 
  ui= basicPage( 
    tags$table(
      uiOutput( "myheader" ),
      uiOutput( "mybody" )

    )

  ),

  server= function( input, output ) { 

    output$myheader <- renderUI({
      tags$thead(
        tags$tr( lapply( colnames( tt ), function( x ) tags$th( x ) ) )
      )

    })

    output$mybody <- renderUI({
      rows <- list()
      for( i in 1:nrow( tt ) ) {
        rows[[i]] <- tags$tr( lapply( tt[i,], function( x ) tags$td( x ) ) )
      }

      tags$tbody( rows )
    })
  } ) )

theory 中,我将分别创建表的body和header元素。但是,闪亮渲染页面的方式,两个元素最终都在表格的外面

enter image description here

是否有可能(如果是,那么如何)在Shiny中分别更新表格标题和正文?

简短解释为什么我没有使用默认的xtable或dataTable:我在R中有一个非常大的数据帧,所以我不想使用dataTable。过滤,搜索,排序和分页都应该在服务器端完成。但是,由于我想拥有所有这些好玩的噱头,我需要重新实现数据帧到HTML表的转换。我遇到了表头中单选按钮的问题 - 当表重新显示时,按钮被重置并触发另一个事件。最简单的解决方案(也更优雅)是将表体与桌头分开渲染。

1 个答案:

答案 0 :(得分:2)

我不确定为什么会在您的代码中发生这种情况。但是,下面的代码块会按预期生成一个表。这适用于您的应用程序吗?

myheader <- reactive({
  tags$thead(
    tags$tr( lapply( colnames( tt ), function( x ) tags$th( x ) ) )
  )
})


mybody <- reactive({
  rows <- list()
  for( i in 1:nrow( tt ) ) {
    rows[[i]] <- tags$tr( lapply( tt[i,], function( x ) tags$td( x ) ) )
  }

  tags$tbody( rows )
})

output$mytable <- renderUI({
    tags$table(
      myheader(),
      mybody()
    )
})