需求:生成范围可选的滑动条,并根据滑动后的范围,动态生成ggplot2图片
library('ggplot2')
library('shiny')
# 定义数据:内含 '时间' '数值' '种类名' 三个列标签
date <- as.Date(c("2013-1-12","2013-1-13","2013-1-14","2013-1-15","2013-1-16","2013-1-17","2013-1-18","2013-1-19"))
num <- c(13,14,12,15,16,18,17,19)
type_name <- c("cc","dd","cc","dd","cc","dd","cc","dd")
d <- data.frame(date,num,type_name)
# 定义UI端
ui <- fluidPage(
# Application title
titlePanel("select data"),
# Sidebar with a slider input for date range
sidebarLayout(
sidebarPanel(
sliderInput("date",
"date range:",
min = min(d$date),
max = max(d$date),
value = c(min(d$date),max(d$date)) # 这个 value 是关键,靠它生成两端可调的滑动条
)
# Show a plot of the generated plot
),
mainPanel(
plotOutput("Plot")
)
)
)
# Define server logic required to draw a ggplot chart
server <- function(input, output) {
# 定义 df1 是另一个关键点,要想实现图表的时间范围随着滑动条的变化而改变,df1这个 dataframe必须是 reactive的(反应式的),
# 而且注意subset的操作,是通过 input$date[1] 和input$date[2] 这两个输入来取到的,这样一旦滑动条范围改变,
# 这两个输入值就会改变,而 df1 被 reactive() 函数声明为一个反应值 ,
# 所以 df1 会在 input$date[1] 和 input$date[2] 改变后进行刷新,这样就完成了动态生成 dataframe 的要求
df1 <- reactive(subset(d,date < input$date[2] & date > input$date[1],select = c(date,num,type_name)))
output$Plot <- renderPlot({
p1 <-ggplot(df1(),aes(date,num,colour = type_name)) # 注意第一个参数 df1(),一定要写成函数的形式,虽然在
# 之前定义时,看起来是一个变量,但实际上被 reactive() 函数处理过的对象是一个 反应表达式,只有写成 df1() 的形式,
# 才能在 ggplot() 里运行,如果不加括号,会运行失败
p1 + geom_line(data=df1(),aes(date,num,colour = type_name)) # 注意这句,geom_line() 的参数不能省略,
# 必须把 'data=' , 和 aes() 写全,因为 df1 会改变,如果不写全,geom_line() 是不知道 输入数据集 是要更新的,
# 不写全的结果是图会画不出来。
})
}
# 最后说一下 反应值的问题 ,要把输入ggplot()函数的dataframe变成反应式的,而不是把aes()里面的参数变成反应式的,
# 这点一定要注意,否则会报错,画不出来
# Run the application
shinyApp(ui = ui, server = server)
网友评论