2017-10-06 2 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) 

I는 주석 라인을 제거하면 (X가의 m은 [1,1]) I는 원하는 결과를 얻는다.

나는이 해결 방법을 사용할 수 있지만 빛나는 것처럼 보이게하거나 다른 방법이 있습니까?

답변

1

보통 이러한 용도에는 lapply을 사용합니다. 이렇게하면 게으른 평가로 문제가 발생하지 않습니다. 당신이 reacive 테이블을 사용하려면

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) 

대신

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

같은 것을 사용할 수 있습니다. 뿐만 아니라

for (i in 1:3) { 
    local({ 
    i <- i 
    result[[i]] <<- tfc(data[,,i]) 
    }) 
} 

lapply 작동 :

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

또는

각 루프 반복에 대한 local 범위를 만들 :