library(shiny)
<- fluidPage(
ui sliderInput("obs", "Number of observations", 0, 1000, 500),
actionButton("goButton", "Go!", class = "btn-success"),
plotOutput("distPlot")
)
<- function(input, output) {
server $distPlot <- renderPlot({
output$goButton
input<- isolate(rnorm(input$obs))
dist hist(dist)
})
}
shinyApp(ui, server)
bslib
bslibとはbootstrapのcssをRで使えるようにしたパッケージです。
正確な原文の説明はTools for theming Shiny and R Markdown via Bootstrap 3, 4, or 5. で、ShinyとRmarkdown(もちろんQuartoを含む)で色んなテーマを活用することができます。
この記事ではbslibの活用方法の中でShinyに集中して説明します。
実際、Shinyは基本的にデザインのためbootstrapを使います。 しかし、Shinyはパッケージを構成してるコンポーネントと、関係が複雑に絡まっていて、かなり重いパッケージになってしまい、このため、アップデートで影響を受ける部分が多く、機能中心のアップデートをすることが知られています。
つまり、UIを主に扱うbootstrapの部分は5年前のバージョンである3.4.1バージョンを使っていて、別のテーマ設定をしない場合、特有のブルー/グレーのテーマを基本的に使うことになります。(最近のバージョンは5.3.3)
それでshinyでは停滞したUIをアップデートするため、UIを扱う別のRパッケージを作って上書きするように最近bootstrapの機能を提供するようになりました。
この記事ではbslibの主な使い方は説明しません。
shiny with loading
actionButton`のこの問題を解決するため、色んな方法がありました。
- **progress indicatorを使う方法
この方法はshinyで基本的に提供するProgress Indicator UIを活用する方法で、演算の過程/段階が進むにつれて進行度をユーザーに見せることができます。
<- function(input, output) {
server $plot <- renderPlot({
output$goPlot
input
<- data.frame(x = numeric(0), y = numeric(0))
dat
withProgress(message = 'Making plot', value = 0, {
<- 10
n
for (i in 1:n) {
<- rbind(dat, data.frame(x = rnorm(1), y = rnorm(1)))
dat incProgress(1/n, detail = paste("Doing part", i))
Sys.sleep(0.1)
}
})
plot(dat$x, dat$y)
})
}
<- shinyUI(basicPage(
ui plotOutput('plot', width = "300px", height = "300px"),
actionButton('goPlot', 'Go plot')
))
shinyApp(ui = ui, server = server)
しかし、これは withProgress
, incProgress
または Progress
などの関数やオブジェクトを時間がかかる演算に追加でコードを書かなければならないというデメリットがあります。
2.別のRパッケージを使う
Rのエコシステムには解決しようとする色んな問題があり、その問題毎のRパッケージがあると考えても過言ではないですが、actionButtonと演算結果の間の長い空白をUIに表記するための機能も同じです。
以前のprogress indicatorと似て追加コードを書いて解決する必要がありもう少しデザインや詳細設定をすることができるカスタム機能があると思ってください。
以下はいくつかの例示パッケージと事例です(アルファベット順)。
まとめ
今回はbslibの最新機能であるinput_task_buttonと簡単な使用事例を紹介しました。
これは潜在的にユーザーエクスペリエンスを向上させる機能であり、既存のshinyでは追加コードを書かなければならない手間を解決してくれる機能だと思います。
特に、他のウェブアプリケーションとは違ってShinyでは大容量データ演算のため時間が長くかかる場合が多いですが、比較的貧弱なUI/UXを持っていて、既存のactionButton
をinput_task_button
に置き換える場合、これを補完するのに大きな助けになると思います。
今回の記事が参考になったかと思いますが、次の記事でまたお会いしましょう!
Reuse
Citation
@online{kim2024,
author = {Kim, Jinhwan},
title = {Bslib: Input\_task\_button {소개}},
date = {2024-03-30},
url = {https://blog.zarathu.com/jp/posts/2024-03-30-input-task-button},
langid = {en}
}