我正在自学 Shiny,但我被困在 ggplot2 图上,无法使用反应式 dateRangeInput 作为我的 x 轴。我有几个问题:
Aesthetics must be either length 1 or the same as the data (33108): x, y当我尝试使用 input$date 作为我的 aes(x = input$date...library(shiny)
library(tidyr)
library(ggplot2)
tweets <- read.csv(file.choose())
colnames(tweets)[1] <- "Content"
tweets <- separate(tweets, created_at, c("Date", "Time"), sep = " ")
tweets$Date <-as.Date(tweets$Date, "%m/%d/%Y")
ui <- fluidPage(
dateRangeInput(inputId = "date",
strong("Date Range"),
start = "2009-05-04", end = "2018-02-28",
min = "2009-05-04", max ="2018-02-28" ),
plotOutput("Graph")
)
server <- function(input, output) {
output$Graph <- renderPlot({
ggplot(tweets, aes(x = input$date, y = count)) +
geom_bar(stat = "identity", position = "stack") +
#scale_y_continuous(name = "Retweet Count", limits = c(0,370000), breaks=seq(0,370000,10000)) +
theme(panel.background = element_rect(fill = "white", colour = "grey50"))
})
}
shinyApp(ui = ui, server = server)Run Code Online (Sandbox Code Playgroud)
@Pete900的回答很好地总结了使用方法updateDateRangeInput,有关更多信息,您可以参考闪亮文档的这一部分。
关于你的第二个问题:input$date将返回一个长度为 2 的向量,第一个元素是所选范围的下部,第二个元素是所选范围的上部。您很可能不会直接使用它作为 x 美学,而是用它来对数据进行子集化,然后绘制新的子集数据。你可以例如写
library(dpylr) # alternatevly library(tidyverse)
newtweets <- reactive({
filter(tweets, between(date ,input$date[1], input$date[2]))
})
Run Code Online (Sandbox Code Playgroud)
然后,在你的 ggplot 中,用作newtweets()你的数据。
更新
函数filter和between()(这是 x 大于 ... 和小于 ... 的快捷方式)来自 package dplyr,这对于处理数据帧和彼此配合得很好的包集合的一部分非常有用称为tidyverse(参见此处)。
当您引用新创建的响应式对象时newtweets(),请确保不要忘记括号,因为它现在是一个函数调用,如果输入发生变化,闪亮的数据帧将能够更新。
更新
一个完整的工作示例,其中我创建了一些人工数据:
library(shiny)
library(tidyverse)
library(lubridate)
# tweets <- read.csv(file.choose())
st <- ymd("2009-05-01")
en <- ymd("2018-02-28")
dates <- seq.Date(from = st, to = en, by = 1)
tweets <- tibble(date = dates, count = rnorm(length(dates), mean = 5, sd = 3))
ui <- fluidPage(
dateRangeInput(inputId = "date",
strong("Date Range"),
start = "2009-05-04", end = "2018-02-28",
min = "2009-05-04", max ="2018-02-28" ),
plotOutput("Graph")
)
server <- function(input, output) {
newtweets <- reactive({
filter(tweets, between(date ,input$date[1], input$date[2]))
})
output$Graph <- renderPlot({
ggplot(newtweets(), aes(x = date, y = count)) +
geom_bar(stat = "identity", position = "stack") +
#scale_y_continuous(name = "Retweet Count", limits = c(0,370000), breaks=seq(0,370000,10000)) +
theme(panel.background = element_rect(fill = "white", colour = "grey50"))
})
}
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)