Estou desenvolvendo um aplicativo brilhante no Rstudio. O aplicativo cria dois gráficos: uma série temporal e um gráfico de dispersão. As variáveis que estão sendo plotadas são Water Temperature
e Air Temperature
. O gráfico de série temporal lida com o espaço nos nomes das variáveis sem problemas. No entanto, recebo um erro com os gráficos de dispersão associados aos nomes das variáveis.
O erro é:
Warning: Error in parse: <text>:1:7: unexpected symbol
1: Water Temperature
^
ou
Warning: Error in parse: <text>:1:5: unexpected symbol
1: Air Temperature
^
Suspeito que esses erros tenham algo a ver com o espaço entre Água/Ar e Temperatura. É fundamental manter o espaço em vez de substituí-lo por um sublinhado ou algum outro preenchimento de espaço. Como posso manter o espaço no nome da variável ao fazer gráficos de dispersão?
library(tidyverse)
library(shiny)
library(shinydashboard)
# Create example dataset
set.seed(123)
dat <- data.frame(
Time = rep(seq(1,10,1), times = 2),
Site = rep(c('A', 'B'), each = 10),
Water_Temperature = round(rnorm(20, mean = 20, sd = 5)),
Air_Temperature = round(rnorm(20, mean = 25, sd = 3))
)
dat <- dat %>%
rename(`Water Temperature` = Water_Temperature,
`Air Temperature` = Air_Temperature)
dat_long <- dat %>%
pivot_longer(cols = c("Water Temperature","Air Temperature"),
names_to = 'Variable',
values_to = 'Value') %>%
arrange(Site, Time)
# Define user interface for time series and scatterplot
ui.R <- dashboardPage(
dashboardHeader(title = "Example", titleWidth = 350),
dashboardSidebar(
tags$head(
tags$style(
HTML("
.sidebar-footer {
text-align: center;
}
.sidebar-logo {
display: flex;
align-items: center;
justify-content: center;
}
.sidebar-menu a span {
font-size: 24px;
}
")
)
),
sidebarMenu(
menuItem("Time Series", tabName = "time_series", icon = icon("chart-line")),
menuItem("Scatterplot", tabName = "scatter_plot", icon = icon("chart-line"))
)
),
dashboardBody(
tabItems(
tabItem(
tabName = "time_series",
fluidRow(
box(
title = "Time Series",
status = "primary",
solidHeader = TRUE,
width = 2,
selectInput("siteInput", "Select Site", choices = unique(dat_long$Site)),
selectInput("variableInput", "Select Variable", choices = unique(dat_long$Variable))
),
box(
title = "Plot",
status = "primary",
solidHeader = TRUE,
width = 10,
plotOutput("timeSeriesPlot", height = "700px")
)
)
),
tabItem(
tabName = "scatter_plot",
fluidRow(
box(
title = "Scatterplot",
status = "primary",
solidHeader = TRUE,
width = 2,
selectInput("siteInput2", "Select Site", choices = unique(dat_long$Site)),
selectInput("xAxisInput", "Select X-axis Variable:", choices = unique(dat_long$Variable)),
selectInput("yAxisInput", "Select Y-axis Variable:", choices = unique(dat_long$Variable))
),
box(
title = "Plot",
status = "primary",
solidHeader = TRUE,
width = 10,
plotOutput("scatterPlot", height = "700px")
)
)
),
tabItem(
tabName = "site_info",
fluidPage(
fluidRow(
selectInput("siteInput3", "Select Site", choices = unique(dat_long$Site)),
column(4, dataTableOutput('table'))
)
)
)
)
)
)
# Define server
server.R <- function(input, output) {
output$timeSeriesPlot <- renderPlot({
filteredData <- dat_long %>%
filter(Site == input$siteInput, Variable == input$variableInput)
variableName <- unique(filteredData$Variable)
yLabel <- ifelse(variableName == "Water Temperature", expression(Water~Temperature~(degree*C)),
ifelse(variableName == "Air Temperature", expression(Air~Temperature~(degree*C))))
ggplot(filteredData, aes(x = Time, y = Value)) +
geom_line() +
geom_point() +
scale_x_continuous(breaks = seq(1,10,1)) +
labs(x = "", y = yLabel,
title = paste('Site:', input$siteInput)) +
theme_bw()
})
output$scatterPlot <- renderPlot({
filteredData2 <- dat_long %>%
filter(Site == input$siteInput2)
# Create a reactive label to display the units for the selected variable on the x and y axes
xLabel <- reactive({
switch(input$xAxisInput[1],
`Air Temperature` = expression(Air~Temperature~(degree*C)),
`Water Temperature` = expression(Water~Temperature~(degree*C)))
})
yLabel <- reactive({
switch(input$yAxisInput[1],
`Air Temperature` = expression(Air~Temperature~(degree*C)),
`Water Temperature` = expression(Water~Temperature~(degree*C)))
})
ggplot(filteredData2, aes_string(x = input$xAxisInput, y = input$yAxisInput)) +
geom_point() +
labs(x = xLabel(), y = yLabel(),
title = paste('Site:', input$siteInput2)) +
theme_bw()
})
}
# Run the application
shinyApp(ui = ui.R, server = server.R)
O gráfico de série temporal funciona
O gráfico de dispersão não funciona
Interessante que
aes_string
não consegue lidar com espaços. No entanto, você pode corrigir isso mudando para o.data
pronome que, comoaes_string
está obsoleto, também é a maneira recomendada de fazer (veja?aes_string
), ou seja, usarAlém disso, você está tentando fazer seu gráfico de dispersão a partir de dados longos que não possuem variáveis
Water/Air Temperature
. Para o gráfico de dispersão você deve usar um conjunto de dados amplo, ou seja, usar