R Shiny を使ってWebアプリを作って動くまでやってみる(9) プログラムのモジュール化とGIT

本シリーズでは、「心理学の尺度開発」に特化した、GUIベースの統計処理ソフトを作り上げることを目指しています。

今回は今後プログラムを作り込んでいく過程で複雑になる前に多少準備をしておきます。

プログラムのモジュール化

`Shiny`のプログラムは基本的に3つのプログラムからなることを説明しました。すなわち、

(1) 最初に読み込まれる定義ファイルとしての`Global.R`,

(2) 画面コントロール関連のプログラム`ui.R`,

(3)バックエンド関連プログラムの`server.R`

です。プログラムが複雑になるとserver.Rやui.Rのコードはどんどんながくなってしまうため、見にくいプログラムになってしまいます。そこで、プログラムを意味のあるブロック毎に分割してファイルを分けておくと後から見やすく、メンテナンスのしやすいプログラムになります。ここではモジュール化(分割)して記述する方法を簡単に解説します。

コードを変数に登録するだけ

前回のブログでファイルのアップロード画面をつくりました。

このプログラムをすこしすっきりさせてみます。前回のプログラムからの変更点はいかの5つのファイルです。

なお、前回のアップロード画面までのプログラムを一括でダウンロードできるように前回ブログの最後にリンクも加えておきましたので必要な方はご利用ください。

#ui.R
shinyUI(fluidPage(
    dashboardPage(
        dashboardHeader(title = "Psycho Scale Developer", disable = FALSE, titleWidth = "300px"),
        dashboardSidebar(
            disable = TRUE
        ),
        dashboardBody(
            navbarPage("Main Menus", id="mainTabs", selected = "dataUpload", 
                       # menu1 Data Upload
                       ui_01_001_dataUpload, 
                       
                       # menu2 Basic Stats
                       ui_02_000_basicStats,
                       
                       # menu3 Internal Consistency
                       ui_03_000_internalConsistency
                       
            ) # end of navBarPage

        ) # end of dashboardBody
    )
))
#global.R
library(shiny)
library(shinydashboard)
library(DT)
library(shinyWidgets)

source("ui_01_001_dataUpload.R", local = TRUE)
source("ui_02_000_basicStats.R", local = TRUE)
source("ui_03_000_internalConsistency.R", local = TRUE)
#ui_01_001_dataUpload.R
ui_01_001_dataUpload = 
tabPanel("Data Upload", value="dataUpload", icon = icon("file-upload"),
         tags$head(tags$style(".progress-bar{background-color:#bcbcbc;}")),
         fluidRow(
           column(width=12, align="center", br(),
                  div("Please use 'header' in the first row", style="font-size:16px; color:red; font-weight:bold; margin-bottom: 1em;"),
                  fileInput(inputId = "file1", label = tags$p("Choose CSV File", style="font-size:14px; margin-bottom: 0px;"),
                            accept = c(".csv"),
                            multiple = FALSE,
                            width = "50%",
                            buttonLabel = "Browse...",
                            placeholder = "No file selected"
                  )
                  
           )
         ), # end of fluidRow
         fluidRow(
           column(width=10, offset=1, align="center", br(),
                  uiOutput("quickLook")
           )
         ) # end of fluidRow
)
#ui_02_000_basicStats.R
ui_02_000_basicStats = 
tabPanel(title = "Basic Stats", value="basicStats", icon = icon("line-chart"),
         box(
           title = "Histogram",
           status = "primary",
           plotOutput("plot1", height = 200),
           height = 300
         )
)
#ui_03_000_internalConsistency.R
ui_03_000_internalConsistency = 
tabPanel(title="Internal Consistency", value="internalConsistency", icon = icon("table"))

プログラムの解説

大きな変更点は3つのプログラム

ui_01_001_dataUpload.R

ui_02_000_basicStats.R

ui_03_000_internalConsistency.R

が追加になっていることと、

`ui.R`のプログラムの11,14,17行目、並びに`global.R`の7-9行目にソースファイルの読み込みが追加になった点です。

見てもらえば大体理解できるとおもいますが、`ui_01_001_dataUpload.R`では、もともの`ui.R`にあったデータップロードの画面制御の部分をこのファイルに移して、そのコードを

“ui_01_001_dataUpload = ・・・”

の形で変数として登録し、その変数を元々の`ui.R`の場所で呼び出すという仕掛けです。その上でこの新たに作ったファイル`ui_01_001_dataUpload.R`を`global.R`で登録して最初に呼び出しています。

簡単ですね。こうすればプログラムがすっきりします。なお、`global.R`での呼び出しには、`local=TRUE`がないとワーキングディレクトリーを読みに行って、ファイルが見つかりません・・・的な形になって動かない可能性がありますのでお忘れなく。

GITによるソースコードの管理

プログラムが大きくなるとソースコードの管理が重要になります。一人でやる場合であっても過去の特定の時点にプログラムを戻したい時などもありますので、GITでのソースコード管理をおすすめします。

GITの始め方については色々と解説ブログがありますのでそちらをご参照ください。はじめからGIT用のレポジトリーを作ってから始める方法と、作りかけのプログラムをレポジトリーにいれて始める方法があります。例えば、今回のようにすでに第8回までのブログですこしプログラムができあがっているようなケースでは、以下のステップのようになるかと思います

  1. GITをPC/MACにインストールする
  2. RStudio(でやってると仮定して)メニューの[Tools] -> [Version Control]にプロジェクトオプションとして[GIT]を選ぶだけでです。

ある程度作業の塊としてできあがったところでメッセージをつけて「コミット」が一般的な使い方です。

なお同じようなものに「GITHUB」があります。こちらは、gitで管理しているソースコードをWEB上のレポジトリーにUPすることができる場所です。無料でプライベートなレポジトリーも設定できるのでソースコードの公開だけでなく、バックアップ的に使うこともできますね。

今後

次回は基本的なデータSTATSをチェックするプログラムを作っていく予定です。例えば以下のような確認と処理作業が想定されます。

  • 基本統計量(最大、最小、平均、四分位など)
  • 正規性の検定
  • 箱ひげ、ヒストグラム
  • フロアー・シーリング確認
  • グループ間の有意差検定
  • 外れ値検定と処理
  • 欠損値の扱い