#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