RShiny美国犯罪数据项目for/while循环实现及标签页多输出问题咨询
修改说明
本次修改完全覆盖你提到的两个需求:
- 严格使用强制要求的
for循环实现同风险等级州的筛选输出,符合项目规则 - 将两个安全等级相关输出合并到同一个标签页,正常展示无空白问题
完整可运行代码如下:
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
相关产品推荐
相关产品推荐

