#author("2021-08-21T18:32:55+09:00","external:moriat","moriat")
#author("2021-08-21T23:08:29+09:00","external:moriat","moriat")
#topicpath

** shiny と plotly [#x52817d9]
- 目的~
何をやりたいか。それは、プロダクトに語らせることにする。~
~
- サンプル~
shiny と plotly を使ったページ~
-- [[COVID19 の新規感染者数の推移>https://robo.mydns.jp:3838/COVID19/Japan]]~
--- shiny の働き~
このページにアクセスすると厚労省が提供するCSVファイルがダウンロードされる。~
&color(red){実行時にデータが更新};されることがひとつのポイントである。また、画面の左側で、~
表示する都道府県を&color(red){選択};できる。~
~
--- plotly の働き~
単にグラフを表示するだけでなく、グラフの&color(red){表示範囲の変更};・表示する&color(red){データの選択};~
といった操作ができ、&color(red){マウスオーバーで値が表};示される。~
~
** インスール [#dfef6629]
- 環境
-- Debian Buster
-- R 3.5.2
- 手順
++ shiny パッケージ
 sudo su - -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
++ shiny server
 sudo apt-get install gdebi-core
 wget https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.16.958-amd64.deb
 sudo gdebi shiny-server-1.5.16.958-amd64.deb
++ テスト~
--- http://127.0.0.1:3838/ あるいは、http://インストールしたマシンのIPアドレス:3838/ にアクセスしてみる。~
--- http://127.0.0.1:3838/sample-apps/hello/
~
- 参考URL
-- [[Download Shiny Server for Ubuntu 16.04 or later>https://www.rstudio.com/products/shiny/download-server/ubuntu/]]
** デプロイ(作ったものをウエブで公開) [#ba745620]
- 設置方法~
ui.R と server.R を /srv/shiny-server/ 以下に作ったディレクトリに設置する。~
~
- アクセス方法~
http://127.0.0.1:3838/ディレクトリ名 でアクセスする。外部に公開している場合には、適当なURLでアクセスする。~
~
** サンプルプログラム [#sfcad75a]
-- サイドバーがある例:厚生労働省のサイトから新規感染者数のデータをダウンロードして表示する。
--- [[実際のサイト>https://robo.mydns.jp:3838/COVID19/Japan/]]
--- ui.R~
#divregion
 library(shiny)
 library(plotly)
 
 #### Define UI for application that plots random distributions 
 shinyUI(pageWithSidebar(
     
     ## Application title
     headerPanel("COVID19 Infection"),
     
     sidebarPanel( width=2,
        selectInput("Prefecture",
                     "Choose a prefecture:",
                     choices=list("ALL", "Tokyo", "Kanagawa", "Okinawa", "Osaka", "Hokkaido", "Miyagi"))         
     ),
   
     ## Show a plot of the generated distribution
     mainPanel(
         plotlyOutput("distPlot", width=1024, height=600)
     )
 ))
 
#enddivregion
--- server.R
#divregion
補足説明:ui.R で取得した情報は、input$Prefecture で受け取っているが、この辺数は、~
補足説明:ui.R で取得した情報は、input$Prefecture で受け取っているが、この変数は、~
renderPlotly の中で使用しないとエラーになる。実際、受け取った情報を活用して、画面~
を更新するのは、renderPlotly の中だけである。
 library(shiny)
 library(plotly)
 
 # Define server logic required to draw a histogram
 shinyServer(function(input, output) {
 
     Japan  <- read.csv("https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv", sep=",")
     Japan$Date <- as.Date(Japan$Date)
 
     output$distPlot <- renderPlotly({
 
         prefec  <- input$Prefecture
         
         Pref    <- data.frame(date=as.Date(Japan$Date[Japan$Prefecture==prefec]),
                            num=Japan$Newly.confirmed.cases[Japan$Prefecture==prefec])
         
         runmin5  <- runningmean(Pref$date, Pref$num, 5)
         runmin7  <- runningmean(Pref$date, Pref$num, 7)
         runmin9  <- runningmean(Pref$date, Pref$num, 9)
         
         p  <- plot_ly(     Pref,    x=Pref$date, y=Pref$num,  type="scatter", mode="lines", name=prefec)
         p  <- add_trace(p, runmin5, x=runmin5$x, y=runmin5$y,                 mode="lines", name="5 Days Running Mean")
         p  <- add_trace(p, runmin9, x=runmin9$x, y=runmin9$y,                 mode="lines", name="9 Days Running Mean")
         p  <- add_trace(p, runmin7, x=runmin7$x, y=runmin7$y,                 mode="lines", name="7 Days Running Mean")
     })
 })
 
 ### 日付のリストを作る関数(昨日まで)
 dayslist <- function( zeroday = "2020-01-16", lengthdays = unclass(Sys.Date()) - unclass(as.Date(zeroday)) -1 ){
 #    lenday <- 24*3600
 #    days <- as.character(as.POSIXlt(zeroday)+(0:lengthdays)*lenday)
     days <- as.character(as.Date(zeroday)+(0:lengthdays))
     return(days)
 }
 
 ### 移動平均を求める関数
 ### 平均を計算するデータの個数は奇数である必要がある。
 runningmean <- function(x,y,num=7){
     result <- rep(0, length(y)-(num-1))
     for( i in 1:num){
         result <- result + y[i:(length(y)-(num-i))]
     }
     return (data.frame(x=x[(num+1)/2 + 1:(length(y)-(num-1))], y=result/num ))
 }
#enddivregion
~
-- サイドバーがない例:神奈川県庁のサイトから新規感染者数のデータをダウンロードして表示する。
--- [[実際のサイト>https://robo.mydns.jp:3838/COVID19/Kanagawa/]]
--- ui.R~
#divregion
 library(shiny)
 library(plotly)
 
 ### サイドバーなしの場合
 
 shinyUI(fluidPage(
     titlePanel("COVID19 Kanagawa Infection"),
     plotlyOutput("distPlot", width=1024, height=600)
 ))
#enddivregion
~
--- server.R
#divregion
 library(shiny)
 library(plotly)
 
 # Define server logic required to draw a histogram
 shinyServer(function(input, output) {
 
     Kanagawa <- read.csv("https://www.pref.kanagawa.jp/osirase/1369/data/csv/patient.csv",fileEncoding="SJIS")
     datelist <- dayslist()
     datan <- NULL
     for( datedata in datelist )
     {
         datan <- c(datan, length(Kanagawa$発表日[Kanagawa$発表日==datedata]))
     }
     DailyData <- data.frame( date=as.Date(datelist), num= datan)
 
     runmin5  <- runningmean(DailyData$date, DailyData$num, 5)
     runmin7  <- runningmean(DailyData$date, DailyData$num, 7)
     runmin9  <- runningmean(DailyData$date, DailyData$num, 9)
     
     output$distPlot <- renderPlotly({
         p  <- plot_ly( DailyData,   x=DailyData$date, y=DailyData$num, type="scatter", mode="lines", name="Raw Data")
         p  <- add_trace(p, runmin5, x=runmin5$x,      y=runmin5$y,                     mode="lines", name="5 Days Running Mean")
         p  <- add_trace(p, runmin9, x=runmin9$x,      y=runmin9$y,                     mode="lines", name="9 Days Running Mean")
         p  <- add_trace(p, runmin7, x=runmin7$x,      y=runmin7$y,                     mode="lines", name="7 Days Running Mean")
     })
 })
 
 ### 日付のリストを作る関数(昨日まで)
 dayslist <- function( zeroday = "2020-01-16", lengthdays = unclass(Sys.Date()) - unclass(as.Date(zeroday)) -1 ){
     days <- as.character(as.Date(zeroday)+(0:lengthdays))
     return(days)
 }
 
 ### 移動平均を求める関数
 runningmean <- function(x,y,num=7){
     result <- rep(0, length(y)-(num-1))
     for( i in 1:num){
         result <- result + y[i:(length(y)-(num-i))]
     }
     return (data.frame(x=x[(num+1)/2 + 1:(length(y)-(num-1))], y=result/num ))
 }
#enddivregion

トップ   編集 差分 添付 複製 名前変更 リロード   新規 検索 最終更新   ヘルプ   最終更新のRSS