【R Shiny】別のPCからWebアプリにアクセスする方法|LAN接続・IPv4・host設定を初心者向けに解説

Shiny

R Shinyで作成したWebアプリは、自分のパソコンだけでなく、同じネットワークに接続した別のパソコンから操作することもできます。

例えば、大学の授業で教員がR Shinyアプリを起動し、学生がそれぞれのパソコンからアクセスするような使い方が考えられます。また、研究室内で作成した解析ツールを、ほかのパソコンから操作してもらうことも可能です。

通常、RStudioからShinyアプリを起動すると、自分のパソコンのブラウザにアプリが表示されます。しかし、起動時の設定を変更すると、LAN(ローカルネットワーク)を通じて別のパソコンからアクセスできるようになります。

今回は、実際に動く簡単なサンプルアプリを作成し、別のパソコンからR Shinyアプリを操作するための設定と手順を紹介します。

なお、R Shinyそのものの概要や基本的なアプリの作り方については、以下の記事で紹介しています。

この記事ではShinyの基本構造の説明は最小限にとどめ、ネットワーク経由でアプリを利用する方法を詳しく説明します。

1. R Shinyを別のパソコンから利用する仕組み

まず、R Shinyアプリを別のパソコンから利用する仕組みを整理します。

例えば、教員のパソコンでShinyアプリを起動し、学生3人がそれぞれのパソコンからアクセスする場合を考えてみましょう。

       同じLAN(ローカルネットワーク)

教員PC
┌─────────────────┐
│     RとShinyを実行      │
│     Webアプリを提供     │
└────────┬────────┘
     │
     Wi-Fi / LAN
     │
┌──────────┼──────────┐
│ │ │
学生PC1 学生PC2 学生PC3
ブラウザ ブラウザ ブラウザ

この場合、教員のパソコンが「サーバー」として動作します。

サーバーというと専用の高性能なコンピューターを想像するかもしれませんが、小規模な用途であれば、一般的なWindowsパソコンでもサーバーの役割を担えます。

教員PCではRとShinyが動作し、学生PCではChromeやEdgeなどのWebブラウザを使用します。

つまり、学生側にはRやRStudioをインストールする必要がありません。

Rによる計算処理は基本的に教員PCで実行され、その結果が学生PCのブラウザに表示されます。

ただし、この方法を利用するには、教員PCと学生PCの間でネットワーク通信が許可されている必要があります。

同じWi-Fiに接続していても、必ずしも端末同士が通信できるわけではない点には注意が必要です。

2. localhostとIPアドレスの違い

R Shinyを起動すると、ブラウザに次のようなアドレスが表示されることがあります。

http://127.0.0.1:3838

または、

http://localhost:3838

ここで使われている 127.0.0.1 は、自分自身のパソコンを指す特別なIPアドレスです。

localhost も同様に、自分自身のパソコンを指す名前として使用されます。

例えば、教員PCでShinyアプリを起動している場合、教員PCのブラウザから 127.0.0.1:3838 にアクセスすればアプリを開けます。

しかし、学生PCで同じアドレスを入力しても、教員PCのアプリにはアクセスできません。

学生PCにとっての 127.0.0.1 は、学生PC自身だからです。

別のパソコンからアクセスするには、教員PCに割り当てられたLAN内のIPアドレスを使用します。

例えば、教員PCのIPアドレスが 192.168.1.20 であれば、学生PCからは次のようにアクセスします。

http://192.168.1.20:3838

ただし、IPアドレスを指定するだけでは接続できません。

Shinyアプリ側でも、別のパソコンからの接続を受け付ける設定が必要です。

3. 今回作成するサンプルアプリ

今回は、LAN接続を確認するための簡単なアプリを作成します。

アプリの機能は次の3つです。

  1. 名前を入力する
  2. スライダーで数値を選択する
  3. ボタンを押すと、入力した名前と数値が表示される

このアプリを別のパソコンから操作できれば、ブラウザから教員PCのShinyアプリへ入力情報を送り、結果を受け取れていることが確認できます。

必要な環境

アプリを起動するパソコンには、RとShinyパッケージが必要です。

RStudioを利用すると、コードの編集や実行が簡単です。

Shinyパッケージをまだインストールしていない場合は、RStudioのConsoleで次のコードを実行してください。

# Shinyパッケージをインストールする
# 最初の1回だけ実行すればよい
install.packages("shiny")

すでにShinyをインストールしている場合は、この操作を省略できます。

4. サンプルアプリのコード

RStudioで「File」→「New File」→「R Script」を選択し、新しいファイルを作成します。

以下のコードをすべてコピーして貼り付けてください。

# ==============================================
# R Shiny 別PC接続テストアプリ
# ==============================================

# Shinyパッケージを読み込む
library(shiny)


# ----------------------------------------------
# 1. アプリの画面を作成する
# ----------------------------------------------

ui <- fluidPage(

  # アプリのタイトル
  titlePanel("R Shiny 接続テスト"),

  # 説明文を表示する
  p("別のパソコンから操作できるか確認するアプリです。"),

  # 名前を入力する欄
  textInput(
    inputId = "name",
    label = "名前を入力してください",
    value = ""
  ),

  # 数値を選択するスライダー
  sliderInput(
    inputId = "number",
    label = "好きな数値を選んでください",
    min = 0,
    max = 100,
    value = 50
  ),

  # ボタンを作成する
  actionButton(
    inputId = "button",
    label = "結果を表示"
  ),

  # 区切り線
  hr(),

  # 結果を表示する場所
  h3("実行結果"),

  verbatimTextOutput("result")

)


# ----------------------------------------------
# 2. ボタンを押したときの処理
# ----------------------------------------------

server <- function(input, output, session) {

  # ボタンを押したときに実行する
  observeEvent(input$button, {

    # 入力された名前を取得する
    user_name <- input$name

    # 選択された数値を取得する
    user_number <- input$number

    # 名前が空欄なら「ゲスト」とする
    if (trimws(user_name) == "") {
      user_name <- "ゲスト"
    }

    # 結果を画面に表示する
    output$result <- renderText({

      paste0(
        "こんにちは、", user_name, "さん。\n",
        "選択した数値は ", user_number, " です。\n",
        "R Shinyアプリは正常に動作しています。"
      )

    })

  })

}


# ----------------------------------------------
# 3. アプリを作成する
# ----------------------------------------------

shinyApp(
  ui = ui,
  server = server
)

app.Rという名前で保存する

作成したコードを app.R という名前で保存してください。

例えば、デスクトップに Shiny_LAN_Test というフォルダを作成し、その中に保存します。

Shiny_LAN_Test
    └── app.R

今回のサンプルアプリは、この1ファイルだけで動作します。

なお、このコードは入力した名前や数値をファイルに保存しません。入力内容はブラウザのShinyセッション内で扱われます。

5. まずは自分のPCで動作確認する

最初に、作成したアプリが正常に動作するか確認します。

RStudioで app.R を開き、「Run App」をクリックしてください。

正常に起動すれば、アプリが表示されます。

名前を入力し、スライダーを動かして「結果を表示」をクリックします。

入力内容が表示されれば成功です。

Consoleから起動する方法

RStudioのConsoleからアプリを起動することもできます。

# app.Rをファイル選択画面で指定する
app_file <- file.choose()

# 自分のPCだけで使う設定で起動する
shiny::runApp(
  appDir = dirname(app_file),
  host = "127.0.0.1",
  port = 3838,
  launch.browser = TRUE
)

file.choose() を実行すると、ファイル選択画面が表示されます。

先ほど保存した app.R を選択してください。

dirname(app_file) は、選択したファイルが保存されているフォルダを取得する処理です。

runApp() は、そのフォルダにあるShinyアプリを起動します。

このコードでは、host = "127.0.0.1" としているため、同じパソコンからのアクセスだけを受け付けます。

*開いたページをブラウザ上で閉じても、RstudioのConsole上は動いている状態になっています。

 赤いSTOPボタンを押して、終了してください。

6. 別のPCからアクセスできるようにする

ここからが今回の中心です。

別のパソコンからShinyアプリを操作するには、起動時の host を変更します。

具体的には、次のように指定します。

host = "0.0.0.0"

0.0.0.0 は、利用可能なIPv4ネットワークインターフェースで接続を受け付けるための設定です。

これは、学生に 0.0.0.0 を入力してもらうという意味ではありません。

学生には、教員PCに実際に割り当てられたIPv4アドレスを知らせます。

LAN接続用の起動コード

先ほどのShinyアプリを停止した状態で、次のコードをRStudioのConsoleに貼り付けて実行します。

# ==============================================
# LAN接続用のShiny起動コード
# ==============================================

# app.Rを選択する
app_file <- file.choose()

# 別のPCからの接続を受け付ける設定で起動する
shiny::runApp(

  # app.Rが保存されているフォルダ
  appDir = dirname(app_file),

  # LAN側からの接続も受け付ける
  host = "0.0.0.0",

  # 通信に使うポート番号
  port = 3838,

  # 起動したPCでもブラウザを開く
  launch.browser = TRUE

)

このコードを実行すると、ShinyがLAN側からの接続を受け付けられる状態になります。

ただし、実際に別PCからアクセスできるかどうかは、Windowsファイアウォールやネットワークの設定にも左右されます。

この方法は、自分で管理している家庭内LANなど、利用が許可された信頼できるネットワークで試してください。

大学や企業の管理ネットワークで、通信制限を回避するための設定変更を行うことは推奨しません。

7. WindowsでIPv4アドレスを確認する

次に、Shinyアプリを起動しているパソコンのIPv4アドレスを調べます。

Windowsでは、ipconfig というコマンドを使用できます。

① コマンドプロンプトを開く

Windowsのスタートメニューで「cmd」と入力し、コマンドプロンプトを起動します。

② ipconfigを実行する

次のコマンドを入力します。

ipconfig

すると、ネットワーク接続に関する情報が表示されます。

Wi-Fiで接続している場合は、「Wireless LAN adapter Wi-Fi」などの項目を探してください。

その中に、IPv4アドレスが表示されています。

例えば、次のような表示です。

IPv4 Address . . . . . . : 192.168.1.20

この場合、192.168.1.20 が教員PCのIPv4アドレスです。

なお、これは説明用の例です。実際のIPアドレスは環境によって異なります。

複数のIPv4アドレスが表示される場合

パソコンに複数のネットワーク接続があると、IPv4アドレスも複数表示されることがあります。

例えば、Wi-Fiと有線LANの両方に接続している場合や、VPN、仮想ネットワークアダプターなどがある場合です。

その際は、学生PCとの通信に使用するネットワークのIPv4アドレスを選択します。

IPv4アドレスは変わることがある

家庭用ルーターでは、DHCPという仕組みによってIPアドレスが自動的に割り当てられることが一般的です。

そのため、再接続などによってIPv4アドレスが変わる場合があります。

前回と同じアドレスとは限らないため、接続できない場合は現在のIPv4アドレスを確認してください。

8. 別のPCのブラウザからアクセスする

教員PCでShinyアプリを起動したままにします。

次に、同じLANに接続した別のパソコンで、ChromeやEdgeなどのブラウザを開きます。

アドレス欄に、次の形式で入力してください。

http://教員PCのIPv4アドレス:3838

例えば、教員PCのIPv4アドレスが 192.168.1.20 の場合は、次のように入力します。

http://192.168.1.20:3838

正常に接続できれば、教員PCで動作しているShinyアプリが表示されます。

別のPCから名前を入力し、スライダーを操作して「結果を表示」をクリックしてください。

入力した内容が表示されれば、LANを通じたShinyアプリの操作に成功です。

どのパソコンでRの処理が行われている?

この場合、Rの処理は基本的に教員PCで実行されます。

学生PCは、ブラウザで入力や表示を行っているだけです。

そのため、学生PCにRやShinyをインストールする必要はありません。

9. 複数人で同時にアクセスできる?

R Shinyは、複数の利用者からの接続を受け付けられます。

例えば、教員PCで1つのShinyアプリを起動し、学生A、学生B、学生Cがそれぞれブラウザからアクセスすることが可能です。

今回のサンプルでは、ブラウザごとに独立したShinyセッションが作られます。

したがって、学生Aが入力した名前が、学生Bの画面にそのまま反映されることは通常ありません。

同じアプリでも利用者ごとに画面を管理できる

Shinyでは、server の中に記述した処理は、基本的に各セッションに対応して実行されます。

今回のコードでも、学生ごとの入力を別々に扱えます。

ただし、すべての処理が自動的に利用者ごとに分離されるわけではありません。

例えば、全利用者が同じCSVファイルに回答を書き込む場合は、ファイルの同時更新による競合が起こる可能性があります。

そのため、複数人の回答を保存するアプリでは、データベースなどを使った適切な保存方法を検討する必要があります。

100人以上でも使える?

理論上は多数の利用者がアクセスできますが、実際に快適に動作する人数は、アプリの処理内容やサーバー性能によって異なります。

例えば、単純な数値計算を行うアプリと、大量のデータを解析するアプリでは、必要な計算資源が大きく異なります。

また、R Shinyでは、時間のかかる処理がほかの利用者の応答に影響する場合もあります。

したがって、100人以上が同時に利用する授業では、事前の負荷試験が重要です。

今回のサンプルは接続の仕組みを理解するためのものであり、大人数での安定動作を保証するものではありません。

10. hostとportとは?

今回の設定で重要なのが、host と port です。

host:どこからの接続を受け付けるか

host は、Shinyがどのネットワークアドレスで接続を受け付けるかを指定するものです。

hostの設定意味
127.0.0.1自分のPCからの接続だけを受け付ける
0.0.0.0利用可能なIPv4インターフェースで接続を受け付ける

自分のPCだけで使う場合は、127.0.0.1 で十分です。

別のパソコンからアクセスする場合は、LAN側からの接続を受け付けられるように設定する必要があります。

ただし、0.0.0.0 を指定しても、ファイアウォールやネットワーク側で通信が制限されていればアクセスできません。

port:通信先のプログラムを区別する番号

port は、同じパソコン内で通信先のサービスを区別するための番号です。

今回のコードでは、次のように設定しています。

port = 3838

そのため、ブラウザからアクセスするときには、IPアドレスの後ろに :3838 を付けます。

3838はShinyでよく使われるポート番号ですが、必ず3838にする必要はありません。

別の番号を指定することも可能です。

ただし、同じポートを別のプログラムが使用している場合は、Shinyを起動できないことがあります。

11. 別のPCから接続できない場合

教員PCではShinyアプリが正常に動作しているのに、別のPCでは接続できない場合があります。

代表的な原因を紹介します。

原因① hostが127.0.0.1になっている

自分のPCだけで利用する設定のままでは、別のPCから接続できません。

LAN接続用の起動コードを使用しているか確認してください。

原因② IPv4アドレスが違う

教員PCのIPアドレスが変更されている可能性があります。

ipconfig で現在のIPv4アドレスを確認してください。

複数のネットワークアダプターがある場合は、適切なアドレスを選択する必要があります。

原因③ ネットワーク内の端末間通信が禁止されている

同じWi-Fiに接続していても、端末同士が通信できるとは限りません。

例えば、家庭用ルーターのゲストネットワークでは、ほかの端末へのアクセスが制限される場合があります。

大学や企業のネットワークでも、同様の制限が設定されていることがあります。

原因④ Windowsファイアウォール

Windowsのファイアウォールによって、Shinyへの着信接続が制限されている可能性があります。

ただし、ファイアウォール全体を無効にすることは推奨しません。

組織が管理するPCでは、ネットワーク管理者に相談してください。

個人所有のPCでも、許可された信頼できるネットワークに限定し、必要最小限の通信許可にとどめることが重要です。

原因⑤ 大学のeduroamなどで通信が制限されている

大学で利用されているeduroamなどの無線LANでは、端末同士の直接通信が制限されている場合があります。

これはネットワークのセキュリティを確保するための設定であり、Shinyアプリに問題があるとは限りません。

eduroamは学術機関向けの無線LANローミングサービスですが、接続先のネットワークは各参加機関によって管理されています。

そのため、eduroamに接続しているというだけで、端末間通信の可否が一律に決まるわけではありません。

接続できない場合は、制限を回避しようとせず、大学のネットワーク管理者に相談するか、別の運用方法を検討してください。

12. この方法のメリット

R ShinyをLAN経由で利用する方法には、いくつかの利点があります。

学生側にRのインストールが不要

学生はブラウザからアクセスするだけでアプリを利用できます。

RやRStudioのインストール、パッケージの準備などを学生全員に行ってもらう必要がありません。

アプリを1か所で管理できる

アプリ本体は教員PCに置かれているため、学生全員にコードを配布する必要がありません。

アプリを修正した場合も、教員PC側のコードを更新し、必要に応じて再起動すれば、新しい内容を提供できます。

複数人が同時に操作できる

Shinyは複数のブラウザセッションを扱えます。

利用者ごとの入力を独立して処理することも可能です。

専用サーバーなしで試せる

自分で管理しているLAN内であれば、通常のパソコンを使って、小規模なShinyアプリの共有を試せます。

本格的なWebサーバーを用意する前の動作確認にも適しています。

13. この方法のデメリットと注意点

一方で、実際の授業や研究に利用する場合には、いくつかの制約があります。

ホストPCを起動し続ける必要がある

教員PCでR Shinyを終了すると、学生はアプリを利用できなくなります。

また、PCがスリープしたり、ネットワークが切断されたりした場合も、利用できなくなることがあります。

ネットワークの制限を受ける

LAN内での端末間通信が禁止されている環境では、接続できません。

特に大学や企業では、ネットワーク管理方針を確認する必要があります。

認証機能がない

今回のサンプルには、利用者認証や管理者パスワードを実装していません。

接続可能な人であれば、アプリにアクセスできる可能性があります。

また、今回使用しているHTTP通信は、HTTPSのように通信内容を暗号化するものではありません。

したがって、個人情報、学生の成績、研究上の機密データなどを扱う用途には、そのまま使用しないでください。

アプリを閉じると入力内容が失われる

今回のサンプルでは、入力内容をファイルやデータベースに保存していません。

そのため、ブラウザを閉じたり、Shinyアプリを再起動したりすると、入力内容は基本的に失われます。

実際の教育用アプリでは、学生が誤ってブラウザを閉じた場合や、通信が切断された場合に備えて、回答や進捗を自動保存する仕組みがあると便利です。

この方法についても、今後の記事で紹介します。

14. HTTPS通信にすることはできる?

今回紹介した方法では、ブラウザとShinyアプリの通信にHTTPを使用しています。

HTTP通信では、HTTPSのような通信経路の暗号化は行われません。

そのため、入力された情報を安全に取り扱う必要がある場合には、HTTPSへの対応を検討する必要があります。

R ShinyをHTTPSで利用する方法はいくつかあります。

例えば、Caddyなどのリバースプロキシを利用してHTTPS通信を処理する方法や、HTTPSに対応したホスティングサービスを利用する方法があります。

ただし、LAN内でHTTPSを利用する場合は、証明書の準備や利用者PCでの信頼設定などが必要になることがあります。

また、HTTPSは通信経路を暗号化する仕組みであり、利用者認証やデータベースのアクセス制御を自動的に実現するものではありません。

そのため、今回の記事ではHTTPSの設定方法までは扱わず、LAN内でShinyアプリを共有する基本的な仕組みの紹介にとどめます。

15. 学生の回答や進捗を管理する場合は?

R Shinyでは、学生の回答内容、ボタンを押した順序、操作時刻、学習進捗などを記録することもできます。

例えば、次のような情報を収集できます。

  • 学生が入力した回答
  • 回答を確定した時刻
  • ボタンを押した順序
  • 各ページの閲覧や移動
  • テストの開始時刻と終了時刻
  • 完了した学習項目

これらの情報は、R Shinyのイベント処理とデータ保存機能を組み合わせることで記録できます。

ただし、回答や進捗を記録するために、今回のLAN接続方式を使用することが唯一の解決法というわけではありません。

今回のようなLAN接続方式は、小規模な動作確認や試作には便利ですが、大学の授業で多数の学生が利用する場合には、別の構成の方が適している可能性があります。

なお、今回のサンプルアプリには回答や操作履歴の保存機能は実装していません。

実際に記録するには、イベントの取得処理と保存先の設定を追加する必要があります。

16. まとめ

今回は、R Shinyで作成したWebアプリを、別のパソコンから操作する方法を紹介しました。

重要なポイントは、Shinyアプリを起動する際の host 設定と、ホストPCのIPv4アドレスです。

自分のPCだけで使う場合は、次の設定で十分です。

# 自分のPCからのみ接続を受け付ける
host = "127.0.0.1"

一方、LAN側からの接続を受け付ける場合は、次の設定を利用できます。

# 利用可能なIPv4インターフェースで接続を受け付ける
host = "0.0.0.0"

別のPCからは、次の形式でアクセスします。

http://ホストPCのIPv4アドレス:ポート番号

ただし、同じネットワークに接続していても、端末間通信が制限されている場合はアクセスできません。

特に大学などの管理ネットワークでは、ネットワーク管理方針に従って利用する必要があります。

また、今回の方法は、HTTPSや利用者認証を備えた本格的なWeb公開環境を構築するものではありません。

まずは、自分で管理している信頼できるネットワークで、簡単なサンプルアプリを使って仕組みを理解するのがよいでしょう。

次回は、R Shinyで一般利用者用の画面と管理者用の画面を分ける方法を紹介します。

例えば、学生には学習画面だけを表示し、教員には管理画面を表示するといった仕組みです。

画面の切り替えだけでなく、パスワードの設定や、管理者用の機能を適切に保護するための考え方についても取り上げる予定です。

コメント

タイトルとURLをコピーしました