Может быть проще консолидировать ваши операторы if
и добавить req(input$...)
, чтобы убедиться, что эти входные данные существуют до оценки (изначально будет иметь значение NULL).
Кроме того, он вызвал проверку ошибок дляпеременная «ALL» для построения графика корреляции - вы можете сначала убедиться, что входные значения содержатся в (используя %in%
) данных перед построением графика (добавлен оператор для этого).
output$g1
будет вызываться дважды при изменении selectInput
c с зависимостями. Одним из способов решения этой проблемы является использование isolate
на входах, которые вы не хотите запускать output$g1
.
Но, пожалуйста, посмотрите, полезно ли это. Многое зависит от того, как вы хотите, чтобы ваш конечный результат выглядел.
### Chart A
```{r}
output$g1 <- renderPlot({
req(input$b, input$c)
if (input$c == "Trend") {
req(input$r)
if (input$b != "ALL") {
plot_data <- Copy_of_mill_para1 %>% filter(variable == input$b)
} else {
plot_data <- Copy_of_mill_para1
}
if (input$r != "Yes") {
p <- ggplot(plot_data, aes(x = Date, y = value, color = variable)) +
geom_line(size = .2)
} else {
p <- ggplot(plot_data, aes(x = Date, y = value, color = variable)) +
geom_line(size = .2)+geom_point(data = plot_data %>% filter(variable == "A"),aes(x=Date, y = value),color='red',size=3)
}
}
if (input$c == "Correlation") {
req(input$a)
plot_data <- Copy_of_mill_para
if (input$b %in% Copy_of_mill_para1$variable && input$a %in% Copy_of_mill_para1$variable) {
p <- ggplot(plot_data, aes_string(x = input$b, y = input$a)) +
geom_point()
}
}
p
})
plotOutput("g1")
Вот полный Rmarkdown с некоторой консолидацией входных данных и другими незначительными изменениями:
---
title: "Untitled"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: scroll
runtime: shiny
theme: cosmo
---
```{r setup, include=FALSE}
library(shiny)
library(flexdashboard)
library(tidyverse)
```
```{r}
Copy_of_mill_para <- structure(list(
Date = structure(c(1505779200, 1505779500, 1505779800, 1505780100, 1505780400, 1505780700, 1505781000, 1505781300, 1505781600),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
A = c(42, 40, 41, 45, 25, 39, 44, 25, 39),
B = c(27, 36, 40, 31, 44, 34, 39, 44, 41),
C = c(39, 42, 33, 26, 29, 42, 24, 34, 35)),
row.names = c(NA, -9L), class = "data.frame")
Copy_of_mill_para1 <- Copy_of_mill_para %>%
gather(variable, value, -Date)
```
Summary
=================
Inputs {.sidebar}
-----------------------------------------------------------------------
```{r}
selectInput("c", "Filter1", choices = c("", "Trend", "Correlation"))
output$filter_2 <- renderUI({
if (input$c == "") {
return()
} else if (input$c == "Trend") {
div(
selectInput("b", "Trend", choices = c("ALL", levels(factor(Copy_of_mill_para1$variable)))),
radioButtons("r", h5("Highlight"), choices = list("No", "Yes"), selected = "No", inline = T)
)
} else {
div(
selectInput("b", "First Variable", choices = c(levels(factor(Copy_of_mill_para1$variable)))),
selectInput("a", "Second Variable", choices = c(levels(factor(Copy_of_mill_para1$variable))))
)
}
})
uiOutput("filter_2")
```
Column {data-width=350}
-----------------------------------------------------------------------
### Chart A
```{r}
output$g1 <- renderPlot({
req(input$b)
if (isolate(input$c) == "Trend") {
req(input$r)
if (input$b != "ALL") {
plot_data <- Copy_of_mill_para1 %>% filter(variable == input$b)
} else {
plot_data <- Copy_of_mill_para1
}
if (input$r != "Yes") {
p <- ggplot(plot_data, aes(x = Date, y = value, color = variable)) +
geom_line(size = .2)
} else {
p <- ggplot(plot_data, aes(x = Date, y = value, color = variable)) +
geom_line(size = .2)+geom_point(data = plot_data %>% filter(variable == "A"),aes(x=Date, y = value),color='red',size=3)
}
}
if (isolate(input$c) == "Correlation") {
req(input$a)
plot_data <- Copy_of_mill_para
if (input$b %in% Copy_of_mill_para1$variable && input$a %in% Copy_of_mill_para1$variable) {
p <- ggplot(plot_data, aes_string(x = input$b, y = input$a)) +
geom_point()
}
}
p
})
plotOutput("g1")
```