首页 > 解决方案 > 通过循环在 renderUI 中创建值框

问题描述

我想根据我拥有的数据创建一个值框。假设如果我有 5 个consumerdata这样的数据变量,

    id     data    number1   number2
1   k4j       A         67        53
2   rls       B         30        62
3   yv9       C         45        28
4   l6h       D         63        47
5   f08       E         96        75

然后我需要用'name'和'number1'列创建5个值框。我没有显示任何数据,也没有错误。

代码

ui <-  dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Consumer", tabName = "consumerdata")
    )
  ),  
  
  dashboardBody(
    tabItems(
      tabItem(tabName = "consumerdata",
              fluidRow(
                tabBox(width = 12,
                       tabPanel("Label",
                                box(width = 12,
                                    uiOutput("consumer")
                                )
                             )
                          ) 
                       )
                    )
                  )
                )
             )

server <- function(input,output) {
  
    output$consumer <- renderUI({


  lapply(consumerdata$name, function(i) { 
    
    valueBox(i,
             consumerdata$number1,     #here display number1 one by one like name 
             width = 4
             )
      }) 
    
    })
}

shinyApp(ui = ui, server = server)

标签: rshinylapplyshinydashboard

解决方案


您几乎到了那里,现在您可以遍历一系列数字而不是元素本身,然后将这些数字用作索引。

library(shiny)
library(shinydashboard)

ui <-  dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Consumer", tabName = "consumerdata")
    )
  ),  

  dashboardBody(
    tabItems(
      tabItem(tabName = "consumerdata",
              fluidRow(
                tabBox(width = 12,
                       tabPanel("Label",
                                box(width = 12,
                                    uiOutput("consumer")
                                )
                       )
                ) 
              )
      )
    )
  )
)

server <- function(input,output) {

  output$consumer <- renderUI({

    consumerdata <- head(mtcars) #comment this if you already have consumerdata defined

    consumerdata$name <- rownames(consumerdata) #comment this if you already have consumerdata defined

    consumerdata$number1 <- 1:6 #comment this if you already have consumerdata defined


    lapply(1:length(consumerdata$name), function(i) { 


      valueBox(consumerdata$name[i],
               consumerdata$number1[i],     #here display number1 one by one like name 
               width = 4
      )
    } )

  })
}

shinyApp(ui = ui, server = server)

推荐阅读