gpt4 book ai didi

Shiny 的响应式(Reactive) DateRangeInput

转载 作者:行者123 更新时间:2023-12-02 00:36:19 25 4
gpt4 key购买 nike

我正在自学 Shiny,我被困在我的 ggplot2 图表上,无法使用响应式(Reactive) dateRangeInput 作为我的 x 轴。我有几个问题:

  1. 有没有一种方法可以使用我的数据框来获取日期范围输入的最小值、最大值,而不必将它们硬编码,这样当我向数据框添加更多推文时,我就不必对这些值进行硬编码每次?
  2. 我收到错误:Aesthetics must be either length 1 or the same as the data (33108): x, y 当我尝试使用 input$date 作为我的 aes(x = input $日期...

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)

最佳答案

@Pete900 的回答总结了updateDateRangeInput 的使用很好,更多信息可以引用this part Shiny 的文档。

关于您的第二个问题:input$date 将返回一个长度为 2 的向量,其中第一个元素是所选范围的较低部分,第二个元素是所选范围的较高部分。您很可能不会直接将其用作 x 美学,而是将其与您的数据进行子集化,然后绘制新的子集数据。你可以例如写

library(dpylr) # alternatevly library(tidyverse)
newtweets <- reactive({
filter(tweets, between(date ,input$date[1], input$date[2]))
})

然后,在您的 ggplot 中,使用 newtweets() 作为您的数据。

更新函数 filterbetween()(这是 x 大于...和小于...的快捷方式)来自包 dplyr,这非常适合处理数据帧和一组包的一部分,它们可以很好地相互配合,称为 tidyverse(参见 here)。

当您引用新创建的 react 对象 newtweets() 时,请确保不要忘记括号,因为它现在是一个函数调用,它使 shiny 在输入更改时更新数据框。

更新

一个完整的工作示例,我在其中创建了一些人工数据:

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)

关于 Shiny 的响应式(Reactive) DateRangeInput,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com