我有一个闪亮的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 )
即。当我试图让数据反应时。
答案 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)
})
}
)
}