#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. Да, это уже разобрано, так что, надеюсь, я смогу продолжать сейчас. Большое спасибо