我正在 Rstudio 中开发一个闪亮的应用程序。该应用程序创建两个图 - 时间序列和散点图。绘制的变量是Water Temperature
和Air Temperature
。时间序列图可以毫无问题地处理变量名称中的空格,但是,与变量名称关联的散点图出现错误。
错误是:
Warning: Error in parse: <text>:1:7: unexpected symbol
1: Water Temperature
^
或者
Warning: Error in parse: <text>:1:5: unexpected symbol
1: Air Temperature
^
我怀疑这些错误与水/空气和温度之间的空间有关。保留空格而不是用下划线或其他空格填充符替换它至关重要。制作散点图时如何保持变量名称中的空格?
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)
有趣的是
aes_string
不能处理空格。但是,您可以通过切换到.data
代词来解决此问题,该代词已aes_string
被弃用,这也是推荐的方法(请参阅 参考资料?aes_string
),即使用此外,您正在尝试根据没有变量的长数据制作散点图
Water/Air Temperature
。对于散点图,您必须使用宽数据集,即使用