在Shiny中使用相同的输出元素两次

时间:2017-07-18 09:19:25

标签: r datatables shiny

从Shiny画廊拍摄的例子。我想在第一个选项卡上显示ex1和ex2,在第二个选项卡上显示一些中断和ex2。

ui.R

navbarPage(
  title = 'DataTable Options',
  tabPanel('Display length',     DT::dataTableOutput('ex1')),
  tabPanel('Length menu',        DT::dataTableOutput('ex2'))
)

server.R

function(input, output) {

  # display 10 rows initially
  output$ex1 <- DT::renderDataTable(
    DT::datatable(iris, options = list(pageLength = 25))
  )

  # -1 means no pagination; the 2nd element contains menu labels
  output$ex2 <- DT::renderDataTable(
    DT::datatable(
      iris, options = list(
        lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')),
        pageLength = 15
      )
    )
  )

}

我认为以下代码可行,但事实并非如此。它确实在任何标签中显示任何内容。

navbarPage(
  title = 'DataTable Options',
  tabPanel('Display length',     DT::dataTableOutput('ex1'),
           HTML("<br><br><br>"),
           DT::dataTableOutput('ex2')),
  tabPanel('Length menu',        DT::dataTableOutput('ex2'))
)

1 个答案:

答案 0 :(得分:1)

你的ui代码很好,但是:

  

Shiny不支持同名的多个输出。这段代码   将生成HTML,其中两个元素具有相同的ID,即   HTML无效。

所以,我认为你唯一的解决方案是创建第三个表。最好的选择是在中间使用被动,所以你要避免使用相同的代码两次。

function(input, output) {

  # display 10 rows initially
  output$ex1 <- DT::renderDataTable(
    DT::datatable(iris, options = list(pageLength = 25))
  )

  # -1 means no pagination; the 2nd element contains menu labels

  iris_table <- reactive({
    DT::datatable(
      iris, options = list(
        lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')),
        pageLength = 15
      )
    )
  })

  output$ex2 <- DT::renderDataTable(
    iris_table()
  )
  output$ex3 <- DT::renderDataTable(
    iris_table()
  )

}

希望这有帮助!