在 R Shiny 中,如何在服务器函数上创建多个 `outputs$...`

In R Shiny , how to create multiples `outputs$...` on server function

我有这个向量:vec<-c(2,13,56,8,10,11,19)

我需要的输出应该是这样的:

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

vec<-c(2,13,56,8,10,11,19)

    output$report_2 <- renderUI({
...    
x <- 2
    })

    output$report_13 <- renderUI({
...    
x <- 13
    })

    output$report_56 <- renderUI({
...
x <- 56   
    })

    output$report_8 <- renderUI({
...
x <- 8  
    })

output$report_10 <- renderUI({
    ...
    x <- 10  
        })

output$report_11 <- renderUI({
    ...
    x <- 11  
        })

output$report_19 <- renderUI({
    ...
    x <- 19  
        })
    
    
        }

但我需要使用 map,也许 glue。但是我不能

换句话说,对于每个 k 数字,我需要创建一个这样的函数,并使其在闪亮的情况下工作:

output$report_k <- renderUI({
...    
x <- k
    })

有什么帮助吗?

非常感谢

在模块之前,我们将 textOutputoutput[[...]] <- renderSomething 包装在 lapply:

library(shiny)

vec <- c(2,13,56,8,10,11,19)
 
shinyApp(ui = fluidPage(
  
  lapply(vec, function(x) textOutput(paste0("report_", x)))
  
), 

server = function(input, output, session) {
  
  lapply(vec, function(x){
    output[[paste0("report_", x)]] <- 
      renderText({
        x
      })
  })
  
})

以上仪表板是以下的简短版本:

library(shiny)

shinyApp(ui = fluidPage(
  
  textOutput("report_2"),
  textOutput("report_13"),
  textOutput("report_56"),
  textOutput("report_8"),
  textOutput("report_10"),
  textOutput("report_11"),
  textOutput("report_19"),
  
  ), 
  
  server = function(input, output, session) {
  
  vec<-c(2,13,56,8,10,11,19)
  
  output$report_2 <- renderText({
    2
  })
  
  output$report_13 <- renderText({
    13
  })
  
  output$report_56 <- renderText({
    56   
  })
  
  output$report_8 <- renderText({
    8  
  })
  
  output$report_10 <- renderText({
    10  
  })
  
  output$report_11 <- renderText({
    11  
  })
  
  output$report_19 <- renderText({
    19  
  })
  
})

有了模块,我们可以创建一个模块并用 lapply 调用它。我会说这是推荐的方式。

library(shiny)

myModuleUI <- function(id) {
  tagList(
    textOutput(NS(id, "text"))
  )
}

myModuleServer <- function(id, val) {
  moduleServer(id, function(input, output, session) {
    output$text <- renderText({
      val
    })
  })
}

vec <- c(2,13,56,8,10,11,19)

shinyApp(ui = fluidPage(
  
  lapply(vec, FUN = function(x) myModuleUI(paste0("report_", x)))
  
), 

server = function(input, output, session) {
  
  lapply(vec, FUN = function(x) {
    myModuleServer(id = paste0("report_", x),
                   val = x)
    })
  
})