如何在 Shiny R 中添加反应式 for 循环?

Posted

技术标签:

【中文标题】如何在 Shiny R 中添加反应式 for 循环?【英文标题】:How to add a reactive for loop in Shiny R? 【发布时间】:2018-11-28 17:47:37 【问题描述】:

我正在尝试使用 Shiny 创建仪表板。以下是一些示例数据:

###Creating Data
name <- c("Sharon", "Megan", "Kevin")
x <- c(5, 7,3)
y <- c(3,6,2)
z <- c(2,3,7)
jobForm = data.frame(name, x, y, z)

我想弄清楚的是,对于每一行名称,我如何创建自己的 TABLE?我相信有一种方法可以创建一个反应式 for 循环,但我已经做了很长时间并且已经放弃了。

以下是每个名称的仪表板外观的完整代码。此代码仅显示 Sharon 的分数,它应该运行。如果让代码完全运行有任何问题,请告诉我。

我正在使用

包闪亮、闪亮的仪表板和整洁

##Dashboard Header
header <- dashboardHeader(
  title = "My Project")

##Dashboard Sidebar
sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("Dashboard", icon = icon("dashboard"),tabName = "dashboard"),
    menuItem("Job Positions", icon = icon("address-card"), tabName = "jobposition",
             menuSubItem('Sales',
                         tabName = 'sales',
                         icon = icon('line-chart'))
    )
  )
)

##Dashboard Body
body <- dashboardBody(
  tabItems(
    # Dashboard Tab Content
    tabItem(tabName = "dashboard",
            fluidRow(
              #Random Plot
              box( )
            )
    ),

    # Associate Tab Content
    tabItem(tabName = "sales",
            fluidRow(
              #Main Box for Candidate
              box(
                width = 8,
                title = "Candidate 001",
                status = "primary",
                #Box for Table
                box(
                  title = "Table",
                  status = "info",
                  tableOutput("stat1")
                )
              )
            )
    )
  )
)

##User Interface Using Dashboard Function
ui <- dashboardPage(
  skin = "yellow",
  header,
  sidebar,
  body
)

##Server: Instructions
server <- function(input, output)  
  temp <- data.frame(jobForm %>% 
                       slice(1) %>% 
                       select(x:z))
  temp <- as.data.frame(t(temp))
  output$stat1 <-renderTable(
    temp
  ,
  include.rownames=TRUE,
  colnames(temp)<-c("Score")
  )


##Create Shiny App Object
shinyApp(ui, server)

感谢您的帮助

【问题讨论】:

dynamically add plots to web page using shiny的可能重复 【参考方案1】:

你最好用 renderUI 解决这些问题,因为你永远不知道闪亮何时会评估一个表达式,你最好使用 lapply 然后 for 循环。

name <- c("Sharon", "Megan", "Kevin")
x <- c(5, 7,3)
y <- c(3,6,2)
z <- c(2,3,7)
jobForm = data.frame(name, x, y, z)


##Dashboard Header
header <- dashboardHeader(
  title = "My Project")

##Dashboard Sidebar
sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("Dashboard", icon = icon("dashboard"),tabName = "dashboard"),
    menuItem("Job Positions", icon = icon("address-card"), tabName = "jobposition",
             menuSubItem('Sales',
                         tabName = 'sales',
                         icon = icon('line-chart'))
    )
  )
)

##Dashboard Body
body <- dashboardBody(
  tabItems(
    # Dashboard Tab Content
    tabItem(tabName = "dashboard",
            fluidRow(
              #Random Plot
              box( )
            )
    ),

    # Associate Tab Content
    tabItem(tabName = "sales",
            fluidRow(
              #Main Box for Candidate
              uiOutput("candidates")
            )
    )
  )
)

##User Interface Using Dashboard Function
ui <- dashboardPage(
  skin = "yellow",
  header,
  sidebar,
  body
)

##Server: Instructions
server <- function(input, output)  
  temp <- data.frame(jobForm %>% 
                       slice(1) %>% 
                       select(x:z))
  temp <- as.data.frame(t(temp))
  output$stat1 <-renderTable(
    temp
  ,
  include.rownames=TRUE,
  colnames(temp)<-c("Score")
  )

  output$candidates <- renderUI(
    tagList(
      lapply(1:nrow(jobForm), function(idx)
        output[[paste0("stat",idx)]] <- renderTable(
          jobForm[idx,-1]
        )
        box(
          width = 8,
          title = paste0("Candidate: ",jobForm$name[idx]),
          status = "primary",
          #Box for Table
          box(
            title = "Table",
            status = "info",
            tableOutput(paste0("stat",idx))
          )
        )
      )
    )
  )


##Create Shiny App Object
shinyApp(ui, server)

希望这会有所帮助!

【讨论】:

非常感谢! 我仍然想转置我的数据。我要在 renderUI 下添加该代码吗? 嗯,你应该把它放在 renderTable 表达式中,我这次把它放在了 renderUI 表达式中 - 但它不必在那里

以上是关于如何在 Shiny R 中添加反应式 for 循环?的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny:如何在嵌套模块之间传递反应变量

如何在 Shiny 中引用 ui.R 中的反应元素

在 R Shiny 中,当链中的对象被隐藏时,如何维护反应链?

如何将 insertUI() 输出添加到 R Shiny 中的 renderText() 输出?

如何在 R Shiny 中对使用反应数据框呈现的数据表执行计算?

为啥 `R` 管道运算符 `|>` 在使用 Shiny 的反应式编程中不起作用?