动态ui元素数的反应性

时间:2015-07-31 15:00:12

标签: r shiny

我有一个闪亮的Web界面,它从数据库加载任意数量的数据表并显示它们。该方法与此处提出的方法非常相似:Add a dynamic UI element in R shiny data table

但是,在使用界面时,数据表的数量可能会发生变化,在这种情况下,需要重新加载显示的数据表。我的方法失败并显示错误消息

  

.getReactiveEnvironment()中的错误$ currentContext():操作不是   允许没有活跃的反应上下文。 (你试图做点什么   只能在反应性表达或观察者内部完成。)

我尝试构建一个最小的示例,使错误可重现:

model.R

db <- list()
getTables <- function( n ){
  db <<- lapply(seq_len( n ), data.frame, a = 1:2, b = LETTERS[1:2])
  return(db)
}
getTableIndex <- function(){
  seq_along(db)
}

server.R

library(shiny)
shinyServer(function(input, output) {
  db_tables  <- getTables( 3 )
  db_tab_ix  <- getTableIndex()

  output$tabs <- renderUI({
    tables <- lapply( db_tab_ix, function(x){
      tableOutput(paste( "tab", x, sep="_"))
    })
    tagList(tables)
  })

  for( x in db_tab_ix ){
    local({
      output[[paste( "tab", x, sep="_")]] <- renderTable( db_tables[[x]] )
    })
  }
})

ui.R

shinyUI(fluidPage(
  mainPanel(
    uiOutput( "tabs" ),
    sliderInput( "tabs_no", "Integer:",  min=1, max=3, value=1)
  )
))

在这个例子中一切正常。使用

替换server.R的第3行时出现问题
 db_tables <- getTables( input$tabs_no )

即。当我试图让数据反应时。

1 个答案:

答案 0 :(得分:2)

这里的代码有效,我不认为你真的想要任何全球分配的东西:

test <- function(){
  db <- list()
  getTables <- function( n ){
    db <- lapply(seq_len( n ), data.frame, a = 1:2, b = LETTERS[1:2])
    return(db)
  }
  shinyApp(
    ui=fluidPage(
      mainPanel(
        uiOutput("tabs" ),
        sliderInput( "tabs_no", "Integer:",  min=1, max=3, value=1)
      )
    ),
    server=function(input, output) {
      db_tables <- reactive({
        return(getTables(input$tabs_no))
      })
      output$tabs <- renderUI({
        tbl<-db_tables()
        tables <- sapply(1:input$tabs_no, function(x){
          renderTable(tbl[[x]])
        })
        tagList(tables)
      })
    }
  )
}