You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RShiny美国犯罪数据项目for/while循环实现及标签页多输出问题咨询

修改说明

本次修改完全覆盖你提到的两个需求:

  1. 严格使用强制要求的for循环实现同风险等级州的筛选输出,符合项目规则
  2. 将两个安全等级相关输出合并到同一个标签页,正常展示无空白问题

完整可运行代码如下:

library(shiny)
library(tidyverse)
library(ggplot2)

# 定义UI
ui <- fluidPage(
  titlePanel("美国犯罪率统计分析"),
  p("使用侧边栏控件调整筛选条件!"),
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("display_var",
                         "选择需要展示的犯罪类型:",
                         choices = c("谋杀" = "Murder",
                                     "袭击" = "Assault",
                                     "强奸" = "Rape"),
                         selected = "Murder"
      ),
      sliderInput("bins",
                  "直方图分组数:",
                  min = 5,
                  max = 10,
                  value = 7
      ),
      selectInput(
        "search", "查询州安全等级:", choices = rownames(USArrests), selected = NULL)
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("柱状图", plotOutput("barplot")),
        tabPanel("直方图", plotOutput("distPlot")),
        # 合并输出到同一个标签页
        tabPanel("该州安全程度如何?",
                 textOutput("howsafe"),
                 br(),
                 textOutput("howsafe2")
        )
      )
    )
  ))

# 定义服务端逻辑
server <- function(input, output) {
  output$barplot <- renderPlot({
    marchoice <- req(input$display_var)
    sd <- setdiff(names(USArrests),marchoice)
    temp_df <- USArrests
    temp_df[,sd] <- 0
    
    counts <- temp_df$Murder + temp_df$Assault + temp_df$Rape
    names(counts) <- rownames(temp_df)
    barplot(counts, 
            main="美国各州犯罪总数统计",
            xlab="州",
            ylab="犯罪数量",las=2,col=rgb(0.2,0.4,0.6,0.6))
  })
  # 犯罪等级分类
  CategorisedMAR <- cut(USArrests$Murder + USArrests$Assault + USArrests$Rape, 
                        breaks=c(0,150,300,450), labels = c("低", "中", "高"))
  names(CategorisedMAR) <- rownames(USArrests)
  
  output$howsafe <- renderText({ 
    req(input$search)
    paste0(input$search, "属于", CategorisedMAR[[input$search]], "犯罪率等级")
  })
  
  # 强制使用for循环实现同等级州筛选
  output$howsafe2 <- renderText({
    req(input$search)
    target_level <- CategorisedMAR[[input$search]]
    same_level_states <- c()
    # for循环遍历所有州匹配等级
    for (state in names(CategorisedMAR)) {
      if (CategorisedMAR[[state]] == target_level && state != input$search) {
        same_level_states <- c(same_level_states, state)
      }
    }
    paste0("其他属于", target_level, "犯罪率的州为", paste(same_level_states, collapse = "、"), "等")
  })
  
  output$distPlot <- renderPlot({
    req(input$display_var)
    USArrests2 <- 
      USArrests %>%
      select(!!input$display_var) %>% 
      mutate(cumulative_frequency = rowSums(across(where(is.numeric))))
    
    ggplot(USArrests2, aes(cumulative_frequency)) + ggtitle("犯罪频率直方图") +
      theme(plot.title = element_text(hjust = 0.5)) + 
      geom_histogram(bins = input$bins,
                     fill = rgb(0.2,0.4,0.6,0.6),
                     colour = "grey30") + 
      xlab(str_c(input$display_var, collapse = " & ")) +
      theme_minimal()
  })
}

shinyApp(ui = ui, server = server)

内容的提问来源于stack exchange,提问作者C Chow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:36:07