シャイニーの基本構成を理解する
シャイニーでアプリを作成していて一番最初に理解すべきなのは公式チュートリアル。
https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/
全7レッスン
英語が苦手な人は翻訳してくれている人のサイトへ。
https://qiita.com/hoxo_m/items/c8365117f3444fb51df4
ざっと目を通して、
フォルダを作成して
ui.rとserver.rをチュートリアルの例コピペして、
動かして、
ちょっとだけ数値を変更して、
ぐらいを行っておけばいい。
Rを知っている人なら約30分くらいかけて流したら十分だと思う。
実行と停止
shinyのui.rやserver.rを例の通りに写経したら、
実行画面で以下を実行する。
desktop上にdemoという名前のフォルダを作成し、中にはui.rとserver.rを格納している前提とする。
ただ置いてあるだけでいい。
#install.packages("shiny")
library(shiny)
path<-"C:\\Users\\Desktop\\demo"
runApp(path)
これを実行したら、RGuiなら既定のブラウザ、
RstudioならRstudioのアプリ画面が立ち上がるだろう。
停止するときはRの実行画面でEscキーを押せばいい。
RGuiからだと、ブラウザを閉じても実行中で反応しなくなってしまうので、
Escを押して目を覚まさせてやる。
チュートリアルが終了したら
チュートリアル後には早速使ってみたいものにシャイニーを使用してみるのがいい。
ただし、カスタムしていると何度もエラーでつまずくことになる。
通常のRであればエラーメッセージが表示されるので困ることもそんなにないが、
shinyの場合突然のシャットオフや、わかりにくいエラーに困らされて挫折しそうになるかもしれない。
だいたいの問題は、
・よくわからんところにコンマがあるぞ
とか
・括弧が足りないで
とか
そんな感じだったりする。
チュートリアルを読んだけれども、上記のようなトラブルに困っている、
または困らないように予習したい。
という方向けに書く。
shinyのui.rは全体が関数
基本構造を理解するために以下にコードを示す。
説明用なのでそのまま動かしても動かないので注意してほしい。
#ui.r
library(shiny)
#define UI structure
shinyUI(navbarPage("表示するタイトル",
tabPanel("ページのタイトル",
sidebarLayout(
sidebarPanel(
submitButton("submitボタンに書き込む名前"), #input項目 それぞれにカンマが必要
numericInput("serverで呼び出す用の名前",
label = h3("ラベル"),
value = 5),
dateInput("serverで呼び出す用の名前",
label = h3("ラベル"),
value = "2019-4-01"),
checkboxGroupInput("serverで呼び出す用の名前",
label = h3("ラベル"),
choices = list("1", "2", "3"),
selected = "1") #最後のinput項目 カンマ不要
), #sidebarPanelの終わり カンマが必要
mainPanel(
textOutput("serverで作っているtextの名前"),
tableOutput("serverで作っているtableの名前"), #テーブルを表示させたい。各項目にカンマ必要
plotOutput("serverで作っているplotの名前") #ページに表示させたいものがplotである。 最後なのでカンマ不要
) #mainpanelの終わりカンマ不要
)#sidebarLayoutの終わり
)#ページの終わり
)#タイトルからのひとまとまりの末端
)#ページ自体の末端
まずui.rからだが、
以上のようにカンマが必要な部分、不必要な部分を記入しておいた。
Rになれている人なら、関数内のオプションがカンマ区切りで表現されているのはご存知だとおもう。
shinyも例外ではなく、それぞれがカンマ区切りになっている。
たとえばplot関数なら、
plot(data, main="plot title", xlim=c(0,10), ylim=c(0, 100), col = "red")
などと書く。
shinyでは、dataに相当するものが、server.rのoutput$~~~に相当している。
xlimのように、オプションをベクトルで指定するものは、c(0,10)のような表記になっている。
これはui.rで言うsidebarPanel内のInput項目に当たる。
Input項目はsidebarPanelという変数の、ベクトル要素的な働きをしていると考えると、カンマの置き方も分かってくる。
イメージとしては
checkboxGroupInput <- (ラベル情報="ラベル", チェック項目=c("1","2","3"), デフォルト="1")
sidebarPanel(Input項目=c(submitButton, numericInput, dateInput, checkboxGroupInput))
のようになっていると考えるといいのでは?
さらにsidebarLayoutの中にはsidebarPanelとmainPanelが入っている。
sidebarLayout(sidebarPanel,mainPanel)
だからmainpanelの後にはカンマが不要。
これをtabpanelを使うことで、ブラウザのようなタブで表示させたい
tabpanel <- tabpanel(sidebarLayout(sidebarPanel,mainPanel))
tabはページの一部なので、pageの中に入れてやる
shinyUI(navbarPage("表示するタイトル",tabpanel)
ここまでわかると、新しいタブページを追加したいと思ったら、navbarPageに追加したらいいことが見えてこないだろうか?
shinyUI(navbarPage("表示するタイトル",tabpanel,tabpanel)
上記の例を考えると、tabpanekとtabpanelの間にコンマが必要であるとわかる。
イメージを実際に書き込んでみる
#ui.r
library(shiny)
#define UI structure
shinyUI(navbarPage("表示するタイトル",
tabPanel("1ページ目のタイトル",
sidebarLayout(
sidebarPanel(
checkboxGroupInput("serverで呼び出す用の名前",
label = h3("ラベル"),
choices = list("1", "2", "3"),
selected = "1") #最後のinput項目 カンマ不要
), #sidebarPanelの終わり カンマが必要
mainPanel(
textOutput("serverで作っているtextの名前"),
tableOutput("serverで作っているtableの名前"), #テーブルを表示させたい。各項目にカンマ必要
plotOutput("serverで作っているplotの名前") #ページに表示させたいものがplotである。 最後なのでカンマ不要
) #mainpanelの終わりカンマ不要
)#sidebarLayoutの終わり
), #1タブページの終わり。2タブページ目を作りたいのでコンマが必要
tabPanel("2ページ目のタイトル",
・・・・・・・・・・・・・・・
)
#2タブページ目の終わり。 3ページ目は無いのでコンマ不要
)#タイトルからのひとまとまりの末端
)#ページ自体の末端
これで構造のイメージやコンマの必要な部分が分かったのではないだろうか?
server.r 側は全体が一つの関数を定義している
server.rは大変簡単な構造をしている。
serverという関数を定義している。
output$~に、renderで行った処理を格納する。
output$~~~の部分は変数名になっていて、
ui.r側のmainPanelの項目で、
plotOutput("plot1")
のように指定して表示させる。
変数なので、名前は何でもいい。
ただ、server側でどんなデータなのかをrender~~~という部分で指定してあげる。
ui.r側でも、どんなデータを表示させたいのかを
~~~Output()で指定する。
tableかtextかplotか。
それぞれの間にコンマは不要で、
render~~~({ }) の中に処理したい内容を書き込めばいい。
renderTable({ data <- read.csv
head(data)
})
このようにしたら、headのテーブルが表示される。
#server.r
library(shiny)
shinyServer(function(input, output) {
output$text1 <- renderText({
print("表示させたい文字")
})
output$table1 <- renderTable({
head()
とか
table
とか
})
output$plot1 <- renderPlot({
plot()
})
output$plot2 <- renderPlot({
})
}#functionの定義の終わり
)#shinyserverの終わり
簡単で特に説明することもない。。。
ライブラリを使いたい
例えばライブラリを入れたい場合などは、shinyと同じく、事前に読み込ませておく。
library(shiny)
library(ggplot2))
shinyServer(function(input, output) {
output$plot2 <- renderPlot({
ggplot()+
geom()+
them_bw
})
}#functionの定義の終わり
)#shinyserverの終わり
以上
shinyって微妙に躓きやすいので、
これで誰かの悩みがちょっとでも解決することを願います。