Shiny renderUI показывает только последний вывод - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь динамически создать некоторый контент с помощью цикла for, используя renderUI и uiOutput, но каждый визуализированный элемент содержит только информацию из последней итерации в цикле for.Пример:

require(shiny)
ui <- fluidPage(
  uiOutput("out1"),
  uiOutput("out2")
)

server <- function(input, output, session) {
  count <- 1
  for(a in c("hello", "world")){
    name <- paste0("out", count)
    output[[name]] <- renderUI({
      strong(a)
    })
    count <- count + 1
  }
}
shinyApp(ui = ui, server = server)

Это выводит world дважды вместо hello world

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

В качестве альтернативы ответу Александра я понял, что использование local({}) также работает благодаря комментарию Зигмунта Завадски:

ui <- fluidPage(
  uiOutput("out1"),
  uiOutput("out2")
)

server <- function(input, output, session) {
  count <- 1
  for(a in c("hello", "world")){
    local({
      b <-a #this has to be added as well
      name <- paste0("out", count)
      output[[name]] <- renderUI({
        strong(b)
      })
    })
    count <- count + 1
  }
}
shinyApp(ui = ui, server = server)
0 голосов
/ 04 октября 2018

Работает при использовании sapply вместо цикла for:

require(shiny)

ui <- fluidPage(
  uiOutput("out1"),
  uiOutput("out2")
)

server <- function(input, output, session) {

  vec <- c("hello", "world")

  sapply(seq_along(vec), function(x) {
    name <- paste0("out", x)
    output[[name]] <- renderUI({
      strong(vec[x])
    })
  })

}

shinyApp(ui = ui, server = server)
...