有个报表的需求,可能需求太过复杂,开发那边搞出来的有点难看(一样,虽然现在好看些了。也可能是站着说话不腰疼)……想到几年没用过的shiny,考虑着要不自己写一个试试。
shiny是R语言的一个web开发包。多的就不介绍了,熟悉R语言的应该知道这个,不熟悉的一两句也说不明白,因为这里主要是介绍用shiny实现的报表(还很low)的功能。
还是没改年轻时候的毛病,太冲动了。搞了些数据,自己编一编,放在了MySQL中,然后捣鼓捣鼓,花了几天空余时间,弄了个也很难看的东西出来。
该报表实现了:分页,从MySQL中读取数据,按照时间和产品类型查询数据等功能。反正有图有真相。先上图:
第一页是实现简单的数据查询功能,展示查询到的数据,这个可以后台改SQL代码实现。炒鸡简单。
第二页是实现了如下功能:①透视表功能②同时根据产品类型或日期范围进行查询和筛选。
第三页主要实现了一些汉化的功能。这也是为了区分几个模块不同的实现方法,累赘出来的一个页面,这样会能够对比数据获取、透视等的不同方法,不过,插一句:汉化后也挺好看的。
炫耀完毕,直接上代码:
#代码开始
#ui.R:
library(shiny)
library(DT)
shinyUI(fluidPage(
headerPanel("测试报表"),
sidebarLayout(
sidebarPanel(
h4("条件选择"),
tags$hr(),#插入一条灰色的分割线
selectInput("pro_type", "产品类型:",
choices = c("'AA'", "'BB'", "'CC'","'AA','BB','CC'")),
end = "2018-05-30",separator = " 至 ",min='2018-05-01',format='yyyy-mm-dd',
language = "zh-CN",width = 200),
tags$hr(),
submitButton("查询"),
width = 3 #调整宽度
),
mainPanel(
tabsetPanel(
tabPanel("测试表1",
#h3(textOutput("table_text25"),style="color:orange"),
#DT::dataTableOutput("table_data")
dataTableOutput("table_data")
),
tabPanel("测试表2",
#h3(textOutput("test_data3"),style="color:orange"),
#DT::dataTableOutput("table_data")
dataTableOutput("table_data3")
),
tabPanel("测试表3",
dataTableOutput("table_data4")
) ) ) )))
##########
#server.R
library(shiny)
library(ROCR)
library(RMySQL)
#install.packages("gdata")
library(gdata)
library(reshape2)
#连接本地
con
#可以先写SQL,查询出结果
sql3
#这句暂时没用
#sql4
#dbSendQuery(con,'SET NAMES gbk')#存在中文字符的话需要用到这段代码
newdata
#暂时没用
#date_data
#透视表
pivot_data
shinyServer(function(input, output){
#######这段暂时没用
text_date1
input$dates[1]
})
output$date_start
format(text_date1(),"%Y-%m-%d")
})
text_date2
input$dates[2]
})
output$date_end
format(text_date2(),"%Y-%m-%d")
})
########################
output$table_data
newdata
#pivot_data
)
########################
output$table_data3
sql5 ='",input$dates[1],"' and the_date
test_data
dcast(test_data,view~the_date,fill =0)
})
##########################
test_date3
sql6 ='",input$dates[1],"' and the_date
dbGetQuery(con,sql6)
})
output$table_data4
dcast(test_date3(),product_type+view~the_date,fill =0),
options = list(pageLength = 20,language = list(
info = '显示第_START_ 至 _END_ 项结果,共 _TOTAL_ 项',
search = '搜索:',
paginate = list(previous = '上页', `next` = '下页'),
lengthMenu = '显示 _MENU_ 项结果'))
)
})
#代码结束
代码如人,想看的还是拷贝出来看吧。因为有点长,就不截图了。反正R代码也比较简单,没有太多格式的限定。
数据的话可以自己编,大概形式如下,最后是入库的。如果需要的话也可以留言给我:
总结:
①样式还比较 简单,功能还比较low,只是实现了一小步,还有很多功能没实现。冲动确实不好,让人欲罢不能,空耗光阴如许。
②如果在数据中就实现加上单引号,就不用把“产品类型”那里的产品弄得那么难看了。
③对于产品类型和时间范围可以通过在server中读取数据库中的数据来赋值,这点还没实现(就是暂时无用的sql4以后会有用的)。
④报表还比较简单,还没有进行较为复杂的运算,这个可以通过SQL实现,更可以通过R语言实现,这些后面逐渐增加。
⑤没有设置断开数据库的机制,会限制连接次数(一般是16次)这个后面也可以用dbDisconnect(con)在server代码中实现。
⑥这个只是自己用用,不好用于生产,Django应该比这个更适合部署,不过这是后话了。
可能总结的不是很全面,为了凑字数啰嗦了不少。
领取专属 10元无门槛券
私享最新 技术干货