2017-10-06 49 views
0

我想输出多个表作为一个uiOutput。如果我使用循环将它们放在一个列表中,那么所有输出都等于最后一个。 实施例:r有光泽的renderUI在循环中

library(shiny) 

ui <- fluidPage(
    mainPanel(
    uiOutput("tables") 
) 
) 

server <- function(input, output) { 
    output$tables <- renderUI({ 
    data=array(rnorm(150),c(10,5,3)) 

    tfc = function(m){ 
#  x = m[1,1] 
     renderTable({m}) 
    } 

    result=list() 
    for(i in 1:3) 
     result[[i]] = tfc(data[,,i]) 

    return(result) 
    }) 
} 

shinyApp(ui = ui, server = server) 

如果删除了注释行(X = M [1,1])我获得所需的结果。

我可以接受这种解决方法,但是为什么有光泽表现得像这样或者有没有其他方法可以做到这一点?

回答

1

我通常使用lapply这样的用例。这样,你就不会遇到懒惰评估的问题。

library(shiny) 

ui <- fluidPage(
    mainPanel(
    uiOutput("tables") 
) 
) 

server <- function(input, output) { 
    output$tables <- renderUI({ 
    data=array(rnorm(150),c(10,5,3)) 

    tfc = function(m){renderTable({m})} 

    lapply(1:3, function(i){tfc(data[,,i])}) 
    }) 
} 

shinyApp(ui = ui, server = server) 

如果你想使用reacive表,你可以使用像

tfc = function(m, output, id){ 
    output[[id]] <- renderTable({m()}) 
    tableOutput(id) 
} 

代替。