首页 > 解决方案 > 将 checkboxInput 添加到 RShiny

问题描述

我对使用 RShiny 真的很陌生,我正在努力添加一个复选框。我被赋予的任务有几个阶段,但我目前停留在这一步。我目前的目标是创建一个 webapp,它显示一个箱线图,其中 x 轴(分类)和 y 轴(数值)变量依赖于 selectInput。到目前为止,我已经完成了这项工作,但现在我需要添加一个复选框,以便在单击它时,箱线图按分类级别分成单独的图。我已经尝试了一些代码变体,但我并没有真正到达任何地方,我想出的最好的方法如下:

library(shiny)
library(palmerpenguins)
library(dplyr)
library(ggplot2)

data <- penguins[,-2]

colnames(data) <- c("Species",
                    "Bill Length (mm)",
                    "Bill Depth (mm)", 
                    "Flipper Length (mm)",
                    "Body Mass (g)",
                    "Sex",
                    "Year")

data.numeric <- data[, c(2:5, 7)]

data.categorical <- data[, c(1,6)]



ui <- fluidPage(
  headerPanel("Penguin boxplots"),
  selectInput("ycol", 
              "Numeric Variable", 
              names(data.numeric),
              selected = names(data.numeric)[3]),
  selectInput("xcol",
              "Categorical Variable",
              names(data.categorical),
              selected = names(data.categorical)[2]),
  checkboxInput("split",
                "Split Levels",
                value = FALSE),
  mainPanel(
    plotOutput("plot1")
  ))



server <- function(input, output){
  reactive({ if (input$split){
    output$plot1 <- renderPlot({
      selectedData <- reactive({
        data[, c(input$xcol, input$ycol)]
      })
      plot(selectedData())
    })
  } else {
    output$plot1 <- renderPlot({
      par(mar = c(20, 4.1, 0, 1))
      selectedData <- reactive({
        data[, c(input$xcol, input$ycol)]
      })
      plot(selectedData())
    })
  }
  })
}

shinyApp(ui = ui, server = server)

正如您将看到的,这里的代码并不是为了实际拆分图表,它只是为了让我能够测试代码,直到我可以让 if 和 else 语句正常工作 - 然后我将分面图适当地。所以真的,我的问题是让 if 和 else 语句起作用。

任何帮助将非常感激!谢谢各位

标签: rif-statementweb-applications

解决方案


你可以试试这样的server

我建议避免在其他表达式中嵌套output和表达式,并复制.reactivereactiveoutput$plot1

相反,您可以简化并在您的内部包含 if/elserenderPlot以根据复选框显示不同的可视化。我添加了一些内容来演示使用不同复选框状态进行绘图的差异。

当然,附加reactive表达式可能会有所帮助,具体取决于您可能希望在应用程序中包含的其他内容。

编辑:将 plot 替换为ggplot geom_boxplotand uses facet_wrap

server <- function(input, output){
  output$plot1 <- renderPlot({
    selectedData <- data[, c(input$xcol, input$ycol)]
    if (input$split) {
      ggplot(data = selectedData, aes(y = .data[[input$ycol]])) +
        geom_boxplot() +
        facet_wrap(~.data[[input$xcol]])
    } else {
      ggplot(data = selectedData, aes(x = .data[[input$xcol]], y = .data[[input$ycol]])) +
        geom_boxplot()
    }
  })
}

推荐阅读