Rを使ってインタラクティブなWebアプリケーションを作成できる Shiny(シャイニー)。統計解析や可視化を誰でも簡単にWebブラウザ上で操作できるようにする強力なツールです。
この記事では、「Shinyって何?」「何が便利?」「どうやって公開するの?」といった基本的な疑問に答えながら、Shinyapps.io を用いたデプロイ(公開)方法を紹介します。
Shinyとは?
Shiny は、R言語で書かれたコードを元に、ブラウザ上で動作する対話型のWebアプリを作成できるパッケージです。RStudioを開発している Posit(旧RStudio社) によって提供されています。
特徴と有用性:
- データ解析やグラフ表示をインタラクティブに 行える
- ユーザーがコードを書かずに 操作できるUIを作れる
- R言語のみで開発可能(HTML/CSS/JSの知識は不要)
- 研究発表、教育、業務報告などに幅広く利用可能
作成方法の概要
Shinyアプリは基本的に次の2つの要素から成り立ちます:
- UI(ユーザーインターフェース):アプリの見た目や操作部分
- Server(サーバーロジック):計算処理やデータ更新の部分
例えば、app.R
というファイルに次のように記述します:
(下記コードをRstudioにコピペし、RunAppもしくは全選択してRunを押せば、実際に動かせます。)
### 薬物動態シミュレーション、Shiny app
### 作成:しろふわ
if (!requireNamespace("shiny", quietly = TRUE)) install.packages("shiny")
if (!requireNamespace("ggplot2", quietly = TRUE)) install.packages("ggplot2")
if (!requireNamespace("deSolve", quietly = TRUE)) install.packages("deSolve")
library(shiny)
library(ggplot2)
library(deSolve)
# モデル関数
drug_1comp <- function(time, state, parameters) {
with(as.list(c(state, parameters)), {
dA1 <- -Ka * A
dC1 <- (Ka * A / Vd) - (Ke * C)
list(c(dA1, dC1))
})
}
# UI定義
ui <- fluidPage(
titlePanel("1コンパートメントモデルのシミュレーション"),
sidebarLayout(
sidebarPanel(
numericInput("dose", "投与量 (mg)", value = 100, min = 1),
sliderInput("Ka", "吸収速度定数 Ka (/hr)", min = 0.01, max = 5, value = 1.0, step = 0.01),
sliderInput("Ke", "消失速度定数 Ke (/hr)", min = 0.01, max = 1, value = 0.1, step = 0.01),
sliderInput("Vd", "分布容積 Vd (L)", min = 0.1, max = 20, value = 5.0, step = 0.1)
),
mainPanel(
plotOutput("pk_plot"),
tags$h4("薬物動態計算式:"),
withMathJax("$$Cp = F \\times \\frac{Dose}{Vd} \\times \\frac{ka}{ka - ke} \\times (e^{-ke \\times Time} - e^{-ka \\times Time})$$"),
tags$h4("※F(バイオアベイラビリティ)は1として計算しています。"),
tags$h4("t1/2, ke, CLtotの関係式:"),
withMathJax("$$t_{1/2} = \\frac{\\ln(2)}{ke}$$"),
withMathJax("$$ke = \\frac{\\ln(2)}{t_{1/2}}$$"),
withMathJax("$$CLtot = ke \\times Vd$$")
)
)
)
# サーバー定義
server <- function(input, output, session) {
output$pk_plot <- renderPlot({
time_seq <- seq(0, 24, by = 0.1)
params <- c(Ka = input$Ka, Ke = input$Ke, Vd = input$Vd)
state <- c(A = input$dose, C = 0)
sim <- ode(y = state, times = time_seq, func = drug_1comp, parms = params)
sim_df <- as.data.frame(sim)
ggplot(sim_df, aes(x = time, y = C)) +
geom_line(color = "blue", size = 1.2) +
labs(x = "Time (hr)", y = "Concentration (mg/L)", title = "1コンパートメントモデル") +
theme_minimal(base_size = 16)
})
}
# アプリ起動
shinyApp(ui = ui, server = server)
これをRStudioで実行すると、Rで新規画面が起動し、アプリが動作します。
下記のような画面が表示されます。各定数をバーを動かすことで変化させることが出来、自動的にグラフが更新されます。

Shinyapps.ioでアプリを公開(デプロイ)
開発したShinyアプリをインターネット上に公開したい場合、最も手軽なのがShinyapps.ioです。Posit社が提供するホスティングサービスで、無料プランでも十分活用できます。
インターネット上に公開すると、Google Chrome等のブラウザ上で表示できます。これにより、Rstudioが利用できない方にも、お使いいただくことが出来ます。
ステップ1:パッケージのインストール
install.packages("shiny") # Shinyアプリ用
install.packages("rsconnect") # デプロイ用
ステップ2:アカウント作成とAPIキーの登録
- Shinyapps.io にアクセスしてアカウントを作成
- 「Account」>「Tokens」で APIトークン を作成
- RStudioで以下のように登録(トークンとシークレットは個人情報なのでGitHub等にアップしないよう注意!)
# 実際のAPIトークンとシークレットは絶対に公開しないでください!
# 公開コードやGitHubにアップする場合は、次のように設定ファイルから読み込むようにしてください。
rsconnect::setAccountInfo(
name='your_account_name',
token='YOUR_TOKEN_HERE',
secret='YOUR_SECRET_HERE'
)
ステップ3:アプリをデプロイ
app.R
が含まれるフォルダに移動- 以下のようにコマンドを実行(アプリ名は任意)
getwd()
setwd("C:/your/path/to/shinyapp/") # 自分の Shinyアプリのフォルダに移動
list.files() #app.Rが1つ入っているようにする
deployApp(appName = "App_name")
公開後、URLが表示され、それを共有すれば誰でもアクセス可能になります。
注意点
app.R
という名前のファイルが必要です(ui.R
とserver.R
の分割型でも可)- APIトークンやシークレットは絶対に公開しない
- 無料プランではアプリ数や使用時間に制限あり
おわりに
ShinyはRユーザーにとって非常に強力な可視化・共有ツールです。Shinyapps.io を使えば、複雑なサーバー構築なしで簡単にWebアプリを公開できます。まずは1つ試してみてはいかがでしょうか?
コメント