感谢你长得这么好看还关注我的博客,祝你天天开心,每天都是棒棒哒~
上篇 https://ask.hellobi.com/blog/okajun/8101 展示了ggplot2的做图效果,留下了疑问“怎样更自动化发现并展示异常数据”,后来想起了shiny包,之前听说后没有仔细研究,现在打开官网,查看了11个内置案例,然后开始尝试实现自己想要的功能。
先看一下shiny的效果,以内置示例1为例:
library(shiny)
#eleven built-in examples
system.file("examples", package="shiny")
runExample("01_hello") # a histogram
效果如下图:(可以滑动改变数值,直方图会自动跟着变)
研究了内置的11个示例,找到规律,现在尝试实现自己的目的:
library(RODBC)
library(shiny)
library(ggplot2)
#所有员工每日注册客户数
channel<-odbcConnect("MySQLServer")
mydata<-sqlQuery(channel,"SELECT YEAR(注册时间)*10000 + MONTH(注册时间)*100 + DAY(注册时间) AS date,归属工号 as employee_id,归属姓名 as name,COUNT(客户编号) AS regist_num
FROM FactLcbRegist
WHERE 归属工号 <> '-'
GROUP BY YEAR(注册时间)*10000 + MONTH(注册时间)*100 + DAY(注册时间),归属工号,归属姓名
ORDER BY YEAR(注册时间)*10000 + MONTH(注册时间)*100 + DAY(注册时间) DESC,COUNT(客户编号) DESC",stringsAsFactors = FALSE)
mydatacus<-sqlQuery(channel,"SELECT 归属工号 as employee_id,注册时间 as regist_time FROM [FactLcbRegist]",stringsAsFactors = FALSE)
#head(mydatacus)
mydatacus$regist_time <- as.POSIXct(mydatacus$regist_time)
mydatacus$date <- format(mydatacus$regist_time,"%Y-%m-%d")
mydatacus$time <- as.numeric(difftime(mydatacus$regist_time,mydatacus$date,units = "hours"))
ui <- fluidPage(
titlePanel("客户注册数据监测"),
sidebarLayout(
sidebarPanel(
selectInput("dataset", "请选择理财经理:",
choices = unique(subset(mydata, regist_num >= 100)$employee_id)),
numericInput("selreg", "注册数筛选条件:", 50),
numericInput("obs", "查看理财经理观测量:", 5)
),
mainPanel(
tableOutput("view"),
tableOutput("view1"),
plotOutput("Plot")
)
)
)
server <- function(input, output) {
output$view <- renderTable({
head(subset(mydata,employee_id == input$dataset), n = input$obs)
})
output$view1 <- renderTable({
subset(mydata, regist_num >= input$selreg)
})
output$Plot <- renderPlot({
ggplot(subset(mydatacus, employee_id == input$dataset),aes(x=date,y=time,fill=date))+
geom_violin()+
geom_jitter(cex=.6)+
labs(title="注册时间分布")+
theme(legend.position="none")+
scale_y_continuous(breaks=seq(0,24,4))
})
}
shinyApp(ui = ui, server = server)
以上就是我尝试的结果,有两个问题还请大神指导:
1、排版问题:想最上边是ggplot2图,下面并列两个table怎么实现?是用shinydashboard包吗?
2、第一个selectinput中理财经理的选择没有做到交互,我写入的是固定值100,如何与“注册筛选条件”后的结果集中的理财经理工号进行交互?
当我把 choices = unique(subset(mydata, regist_num >= 100)$employee_id))
改成: choices = unique(subset(mydata, regist_num >= input$selreg)$employee_id))时:
报错:Error in get(input$selreg) : object 'input' not found
以上是我的思路及做法,谢谢你这么好看还这么有耐心看完了,给你点赞,还请各位大神不吝赐教,谢谢!
后续补充:
使用shinydashboard的效果很不错,如下: