Добавление checkboxInput в RShiny

#r #if-statement #web-applications

#r #if-оператор #веб-приложения

Вопрос:

Я действительно новичок в использовании RShiny, и я изо всех сил пытаюсь добавить флажок. Задача, которую мне дали, состоит из нескольких этапов, но в настоящее время я застрял на этом шаге. В настоящее время моя цель — создать веб-приложение, которое отображает график boxplot с переменными по осям 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 работать.

Любая помощь будет очень признательна! Спасибо, ребята

Ответ №1:

Вы можете попробовать что — то подобное для server .

Я бы рекомендовал избегать вложенности output и reactive выражений внутри других reactive выражений, а также дублирования output$plot1 .

Вместо этого вы можете упростить и включить if / else внутри вашего renderPlot , чтобы показывать разные визуализации в зависимости от флажка. Я добавил немного, чтобы продемонстрировать различия в построении графиков с разными состояниями флажков.

Конечно, дополнительные reactive выражения могут быть полезны, в зависимости от того, что еще вы, возможно, захотите включить в свое приложение.

Редактировать: Заменен сюжет на ggplot geom_boxplot и использует 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()
    }
  })
}
 

Комментарии:

1. Большое вам спасибо, я думаю, это очень поможет. Теперь я пытаюсь использовать ggplot amp; facetwrap вместо этого, но я получаю сообщение об ошибке: ‘Ошибка: не удалось найти функцию «Выбранные данные» * Код, который я написал, выглядит следующим образом: server <- function(input, output){ output$plot1 <- renderPlot({ Выбранные данные <- данные[, c(ввод $ xcol, ввод$ ycol)] if (ввод$ split) { ggplot(selectedData(), aes(x = ввод $ xcol, y = ввод $ ycol)) geom_boxplot() facet_wrap(~input $ xcol) } else { plot(selectedData) } }) } Вы знаете, почему это не сработает?

2. Да, это уже разобрано, так что, надеюсь, я смогу продолжать сейчас. Большое спасибо