Jump to content

Shiny: Difference between revisions

From 太極
Brb (talk | contribs)
Brb (talk | contribs)
 
(35 intermediate revisions by the same user not shown)
Line 26: Line 26:
* [https://appsilon.com/best-r-shiny-books-and-courses/ Top 7 Best R Shiny Books and Courses That Are Completely Free]
* [https://appsilon.com/best-r-shiny-books-and-courses/ Top 7 Best R Shiny Books and Courses That Are Completely Free]
* [https://www.r-bloggers.com/2024/02/level-up-your-r-shiny-team-skills-with-our-free-ebook/ Level Up Your R/Shiny Team Skills with Our Free Ebook]
* [https://www.r-bloggers.com/2024/02/level-up-your-r-shiny-team-skills-with-our-free-ebook/ Level Up Your R/Shiny Team Skills with Our Free Ebook]
* [https://github.com/coatless-talks/stat447-shiny-without-boundaries-one-app-multiple-destinations Shiny without Boundaries: One App, Multiple Destinations]
* [https://www.r-bloggers.com/2025/08/webdev4r-shiny-explained/ WebDev4R: Shiny Explained]
** Shiny in a Nutshell
** Understanding Reactivity
** Understanding Reactive Expressions
** Dynamic/Interactive UI Outputs
** Shiny Modules
** Robust Shiny Apps with Golem
** Client-side Code & Dynamic Tables with {shiny} and `{gt}
** Advanced Widgets with {shinywidgets}
== Cheatsheet ==
https://shiny.posit.co/r/articles/start/cheatsheet/
== Deployment ==
[https://www.r-bloggers.com/2024/11/r-shiny-deployment-5-options-for-individuals-and-enterprises/ R Shiny Deployment: 5 Options for Individuals and Enterprises]


= Deploy to run locally =
= Deploy to run locally =
Line 38: Line 54:


== How to run an R shiny app ==
== How to run an R shiny app ==
* [https://deanattali.com/blog/building-shiny-apps-tutorial/ Building Shiny apps – an interactive tutorial] by Dean Attali
<ul>
* Different ways:
<li>[https://deanattali.com/blog/building-shiny-apps-tutorial/ Building Shiny apps – an interactive tutorial] by Dean Attali
** Click "Run App" in RStudio
<li>Different ways of running an R shiny app from a desktop:
** Call shiny::runApp(shinyApp(ui=ui, server=server, options = list(port = 3838))
* Click "Run App" in RStudio
** Call [https://shiny.rstudio.com/reference/shiny/latest/runApp.html shiny::runApp("~/Directory")] in your R console. This also works if we replaced a directory with an R file.
* Call [https://shiny.posit.co/r/reference/shiny/latest/shinyapp.html shinyApp()].
** options(browser = "/usr/bin/firefox")
** shinyApp(ui=ui, server=server, options = list(port = 3838)) create a Shiny app object. '''Printing the object or passing it to runApp() will run the app.'''
* Call [https://shiny.rstudio.com/reference/shiny/latest/runApp.html runApp()]
** runApp(shinyApp(ui=ui, server=server, options = list(port = 3838))
** runApp("app.R")
** runApp("~/Directory"). This also works if we replaced a directory with an R file.
** R -e "shiny::runApp('~/shinyapp')" from a terminal
** R -e "shiny::runApp('~/shinyapp')" from a terminal
* An [https://gist.github.com/senthilthyagarajan/a714446c9acd8127e4cbef6ede09b1fc example] of "app.R". Edit a table via the "DT" package.
<li>An [https://gist.github.com/senthilthyagarajan/a714446c9acd8127e4cbef6ede09b1fc example] of "app.R". Edit a table via the "DT" package.
* [https://www.mango-solutions.com/turn-shiny-application-into-a-tablet-or-desktop-app/ Turn a shiny application into a tablet or desktop app]
<li>[https://www.mango-solutions.com/turn-shiny-application-into-a-tablet-or-desktop-app/ Turn a shiny application into a tablet or desktop app]
</ul>


== rmarkdown::run() instead of rmarkdown::render() ==
== rmarkdown::run() instead of rmarkdown::render() ==
Line 63: Line 86:
== Deploy on Github Pages: shinylive ==
== Deploy on Github Pages: shinylive ==
<ul>
<ul>
<li>Shinylive is a serverless version of Shiny that runs entirely in the browser using WebAssembly and WebR. It converts your Shiny app into static HTML and JavaScript files—perfect for GitHub Pages.
<li>Restrictions:
* Why tidyverse Isn’t Fully Supported in Shinylive (yet)
** WebAssembly Constraints
** tidyverse is a Meta-Package
** Some tidyverse packages (like tibble or dplyr) may partially work if they've been ported to [https://github.com/r-wasm/webr/ WebR].
* [https://stackoverflow.com/questions/78675456/shinylive-file-size-limitations Shinylive file size limitations] (100MB)
<li>https://posit-dev.github.io/r-shinylive/  
<li>https://posit-dev.github.io/r-shinylive/  
* Shinylive Code Editor https://shinylive.io/r/editor/
* Shinylive Code Editor https://shinylive.io/r/editor/
Line 105: Line 135:
</syntaxhighlight>
</syntaxhighlight>
:After that, modify the ''yaml'' of your [https://github.com/zarathucorp/blog/blob/master/posts/2024-03-04-shinylive/index.qmd index.qmd] and put the contents of the app.R in a code chunk.
:After that, modify the ''yaml'' of your [https://github.com/zarathucorp/blog/blob/master/posts/2024-03-04-shinylive/index.qmd index.qmd] and put the contents of the app.R in a code chunk.
<li>[https://github.com/RamiKrispin/shinylive-r Deploy Shinylive R App on Github Pages]
</ul>
</ul>


Line 114: Line 146:
* [http://shiny.rstudio.com/articles/shinyapps.html Getting started with shinyapps.io] page and [https://www.shinyapps.io/admin/#/dashboard Dashboard] page.
* [http://shiny.rstudio.com/articles/shinyapps.html Getting started with shinyapps.io] page and [https://www.shinyapps.io/admin/#/dashboard Dashboard] page.
* [https://www.shinyapps.io/#pricing Limitations of the free account] (5 applications, 25 active hours per month) on shinyapps.io.
* [https://www.shinyapps.io/#pricing Limitations of the free account] (5 applications, 25 active hours per month) on shinyapps.io.
* [https://docs.rstudio.com/shinyapps.io/appendix.html#default-system-packages Default System Packages].
* [https://hosting.analythium.io/how-many-shiny-apps-can-you-host-for-free/ How Many Shiny Apps Can You Host for Free?]
* [https://hosting.analythium.io/how-many-shiny-apps-can-you-host-for-free/ How Many Shiny Apps Can You Host for Free?]
* [https://blog.rmhogervorst.nl/blog/2021/02/27/deploy-to-shinyapps-io-from-github-actions/ Deploy to Shinyapps.io from Github Actions]
* [https://blog.rmhogervorst.nl/blog/2021/02/27/deploy-to-shinyapps-io-from-github-actions/ Deploy to Shinyapps.io from Github Actions]
Line 121: Line 154:
* <strike>https://taichimd.shinyapps.io/stock/ (quantmod, ggplot2, reshape2, magrittr, rvest packages were used)</strike>
* <strike>https://taichimd.shinyapps.io/stock/ (quantmod, ggplot2, reshape2, magrittr, rvest packages were used)</strike>
* <strike>https://taichimd.shinyapps.io/tspgov (ggplot2, reshape2, magrittr, rvest, plotly)</strike>, [https://www.tsp.gov/fund-performance/ Performance]
* <strike>https://taichimd.shinyapps.io/tspgov (ggplot2, reshape2, magrittr, rvest, plotly)</strike>, [https://www.tsp.gov/fund-performance/ Performance]
* https://shiny.taichimd.us/shiny-examples.html 188 shiny examples. [https://gist.github.com/arraytools/e53610426523c91cae0c487b5dd148e0 source code for this HTML]
* https://taichimd.shinyapps.io/Lasso_Simulation/ Lasso with simulated data
* https://taichimd.shinyapps.io/Lasso_Simulation/ Lasso with simulated data
* https://taichimd.shinyapps.io/shinysurvival/ Kaplan-Meier curves plotter
* https://taichimd.shinyapps.io/shinysurvival/ Kaplan-Meier curves plotter
Line 128: Line 160:
** glmnet, SGL, MSGLasso, grplasso, biospear
** glmnet, SGL, MSGLasso, grplasso, biospear
** dockerfiler, stevedore, babelwhale, liftr
** dockerfiler, stevedore, babelwhale, liftr
* https://taichimd.shinyapps.io/cran-rev-imports/. Number of downloads from reverse imports packages. Useful to identify popular packages.
* https://shiny.taichimd.us/shiny-examples.html 188 shiny examples. [https://gist.github.com/arraytools/e53610426523c91cae0c487b5dd148e0 source code for this HTML]


Note:
Note:


# [https://docs.rstudio.com/shinyapps.io/appendix.html#default-system-packages Default System Packages].
# Two commands are needed to upload an app:  
# Two commands are needed to upload an app:  
#* [https://rstudio.github.io/rsconnect/reference/setAccountInfo.html rsconnect::setAccountInfo()] [the full command is copied from account's token page.  
#* [https://rstudio.github.io/rsconnect/reference/setAccountInfo.html rsconnect::setAccountInfo()] '''the full command including name/token/secret can be copied from [https://www.shinyapps.io/admin/#/dashboard Account dashboard] - Token page'''.  
#* [https://rstudio.github.io/rsconnect/reference/deployApp.html rsconnect::deployApp()] [assume we are in the right working directory]. If the machine contains several accounts, we can use deployApp(account = "XXXX") to specify the account we want to deploy the app. After successful deployment, the browser will open the URL for our app.
#* [https://rstudio.github.io/rsconnect/reference/deployApp.html rsconnect::deployApp()] [assume we are in the right working directory]. If the machine contains several accounts, we can use deployApp(account = "XXXX") to specify the account we want to deploy the app. After successful deployment, the browser will open the URL for our app.
# After we run rsconnect() command to deploy our apps, a new subfolder '''rsconnect''' will be created under our app folder. I add this folder to .gitignore file. But it seems this file/folder does not contain any secret information. So not worry.
# After we run rsconnect() command to deploy our apps, a new subfolder '''rsconnect''' will be created under our app folder. I add this folder to .gitignore file. But it seems this file/folder does not contain any secret information. So not worry.
Line 285: Line 318:
** [https://www.databentobox.com/2020/05/03/secure-shinyproxy/ Securing and monitoring ShinyProxy deployment of R Shiny apps]
** [https://www.databentobox.com/2020/05/03/secure-shinyproxy/ Securing and monitoring ShinyProxy deployment of R Shiny apps]
* https://www.jasperginn.nl/shiny-server-series-pt3/
* https://www.jasperginn.nl/shiny-server-series-pt3/
== Security ==
* [https://www.r-bloggers.com/2025/05/security-blind-spots-in-shiny-why-your-app-is-more-vulnerable-than-you-think/ Security blind spots in Shiny: why your app is more vulnerable than you think]
*# XSS (Cross-Site Scripting): client-side
*# Command Injection: server-side
*# SQL Injection: database-side


== Securing Shiny Server with Caddy ==
== Securing Shiny Server with Caddy ==
Line 294: Line 333:


= Shiny Assistant =
= Shiny Assistant =
[https://shiny.posit.co/blog/posts/shiny-assistant/?s=09 Shiny assistant] 2024/10/9
* https://gallery.shinyapps.io/assistant/#
* [https://shiny.posit.co/blog/posts/shiny-assistant/?s=09 Shiny assistant] 2024/10/9


= Simplifying Parts Of A Shiny App by Creating Functions =
= Simplifying Parts Of A Shiny App by Creating Functions =
Line 308: Line 348:
[https://towardsdatascience.com/how-to-build-a-data-analysis-app-in-r-shiny-143bee9338f7 How to Build a Data Analysis App in R Shiny]
[https://towardsdatascience.com/how-to-build-a-data-analysis-app-in-r-shiny-143bee9338f7 How to Build a Data Analysis App in R Shiny]


= Landing page =
= global.R =
* We can create an HTML file in /srv/shiny-server directory as the landing page where each app is under a sub-directory.
* https://shiny.posit.co/r/articles/improve/scoping/
* [https://apps.machlis.com/ R Shiny Apps by Sharon Machlis]
* [https://stackoverflow.com/a/20334102 Are there global variables in R Shiny?]
* [https://cran.r-project.org/web/packages/shinyLP/index.html shinyLP] package. Bootstrap Landing Home Pages for Shiny Applications
* [https://docs.rstudio.com/shiny-server/#host-a-directory-of-applications-1 Host a directory of applications] from Shiny Server Professional v1.5.17 Administrator's Guide


= The R Shiny packages you need for your web apps =
= The R Shiny packages you need for your web apps =
Line 321: Line 359:


= Shiny + Docker =
= Shiny + Docker =
* [https://rocker-project.org/images/versioned/shiny.html Rocker shiny documentation]
* See [http://www.flaviobarros.net/2015/08/10/share-your-shiny-apps-with-docker-and-kitematic/ this post]. It uses the gui of Docker called '''[https://kitematic.com/ Kitematic]'''.
* See [http://www.flaviobarros.net/2015/08/10/share-your-shiny-apps-with-docker-and-kitematic/ this post]. It uses the gui of Docker called '''[https://kitematic.com/ Kitematic]'''.
* https://hub.docker.com/r/rocker/shiny/ Don't run R Shiny as a non-root user.
* https://hub.docker.com/r/rocker/shiny/ Don't run R Shiny as a non-root user.
Line 338: Line 377:
* [https://www.jumpingrivers.com/blog/shiny-auto-docker/ Automating Dockerfile creation for Shiny apps] 2022/10/20
* [https://www.jumpingrivers.com/blog/shiny-auto-docker/ Automating Dockerfile creation for Shiny apps] 2022/10/20
* [https://www.r-bloggers.com/2023/11/r-shiny-docker-how-to-run-shiny-apps-in-a-docker-container/ R Shiny Docker: How To Run Shiny Apps in a Docker Container] 2023/11/28
* [https://www.r-bloggers.com/2023/11/r-shiny-docker-how-to-run-shiny-apps-in-a-docker-container/ R Shiny Docker: How To Run Shiny Apps in a Docker Container] 2023/11/28
== Quick run ==
'''app.R'''
<pre>
library(shiny)
ui <- fluidPage(
  textInput("name", "Enter your name:"),
  textOutput("greeting")
)
server <- function(input, output) {
  output$greeting <- renderText({
    paste("Hello,", input$name)
  })
}
shinyApp(ui, server)
</pre>
<syntaxhighlight lang='sh'>
docker run --rm -p 3838:3838 \
  -v "$(pwd)/app.R:/srv/shiny-server/app.R" \
  rocker/shiny
</syntaxhighlight>
Bonus: an even shorter app.R
<pre>
library(shiny)
shinyApp(ui = fluidPage("Hi"), server = function(input, output) {})
</pre>
== /etc/shiny-server/shiny-server.conf ==
'''nano shiny-server.conf'''  <BR>
Note: '''run_as shiny;''' is required for avoiding the error: Error loading config: Required "run_as" directive not present or has no users.
<syntaxhighlight lang='ini'>
run_as shiny;
server {
  listen 8080;  # Change from 3838 to any available port
  location / {
    site_dir /srv/shiny-server;
    log_dir /var/log/shiny-server;
  }
}
</syntaxhighlight>
Then run the following. This will '''overwrite''' the default /etc/shiny-server/shiny-server.conf file
<syntaxhighlight lang='sh'>
docker run -it --rm -p 3838:8080 \
  -v $(pwd)/shiny-server.conf:/etc/shiny-server/shiny-server.conf \
  --name shiny \
  rocker/shiny
</syntaxhighlight>
== Idle time ==
Define '''app_idle_timeout''' in shiny-server.conf.
* https://docs.posit.co/shiny-server/#application-timeouts. The default value for app_idle_timeout is 5 seconds.
* Shiny apps rely on WebSockets for client-server communication. WebSocket protocol says WebSocket heartbeats were sent automatically every 15 seconds (by default), even if the user doesn’t move the mouse or type.
* [https://stackoverflow.com/a/62711327 RStudio in Rserver, disable idle timeout on ShinyApp]
* [https://forum.posit.co/t/keep-shiny-app-running-in-shiny-server-no-greying-out/27784 Keep shiny app running in shiny server (no greying out)]
<pre>
server {
  listen 3838;
  # Define a location at the base URL
  location / {
    site_dir /srv/shiny-server;
    log_dir /var/log/shiny-server;
    # Optional: disconnect idle sessions after 15 minutes
    app_idle_timeout 900;
  }
}
</pre>
== shiny-server version ==
<pre>
docker run --rm rocker/shiny shiny-server --version
</pre>
== Multiple connections ==
<ul>
<li>Example 1: show session token
<pre>
library(shiny)
server <- function(input, output, session) {
  output$token <- renderText({
    paste("Your session token is:", session$token)
  })
}
ui <- fluidPage(
  textOutput("token")
)
shinyApp(ui, server)
</pre>
<li>Example 2: multiple connections are run independently
<pre>
library(shiny)
ui <- fluidPage(
  titlePanel("Test: Simultaneous Connections"),
  verbatimTextOutput("session_info"),
  actionButton("click", "Click me"),
  textOutput("click_count")
)
server <- function(input, output, session) {
  # Per-user reactive counter
  counter <- reactiveVal(0)
  observeEvent(input$click, {
    counter(counter() + 1)
  })
  output$click_count <- renderText({
    paste("You clicked", counter(), "times")
  })
  output$session_info <- renderPrint({
    list(
      session_id = session$token,
      timestamp = Sys.time()
    )
  })
}
shinyApp(ui, server)
</pre>
</ul>
== Build rocker/shiny image ==
<syntaxhighlight lang='sh'>
git clone https://github.com/rocker-org/rocker-versioned2.git
docker build -t shiny:4.5.1 -f dockerfiles/shiny_4.5.1.Dockerfile .
</syntaxhighlight>
Only the R versions defined in the '''bakefiles''' directory will be built. The repository file structure is
* build: templates and generation scripts that produce those per-version Dockerfiles. "matrix/all.json" contains R versions that will be used to build images but all files under "matrix" are automatically generated.
* [https://github.com/rocker-org/rocker-versioned2/tree/master/bakefiles bakefiles]: generated *.docker-bake.json (such 4.4.3.docker-bake.json) files used by Docker BuildKit to define how multiple images (including R versions) are built in batches.
* dockerfiles: generated Dockerfiles used to build each image
* Makefile
* scripts: installer scripts (e.g., install_shiny_server.sh) used inside those Dockerfiles
* tests
To build an image based on an old R version (eg R 4.4.0 released 2024/4/24),
<ul>
<li>Method 1. Use release version. https://github.com/rocker-org/rocker-versioned2/releases. R 4.4.0 corresponds to 3a856a4.
<pre>
git checkout 3a856a4
</pre>
<li>Method 2. Find the commit hash nuber.
<pre>
git log -S "4.4.0" -- dockerfiles/
# OR
git log -p -- build/matrix/all.json  # Show diffs
</pre>
to find out the hash number. After that,
<pre>
git checkout 42772bd
# Extra:
git show --name-only 42772bd # show changed files
</pre>
To move back to the master branch,
<pre>
git checkout master
git branch
</pre>
</ul>
== WARN shiny-server - Running as root unnecessarily is a security risk ==
We may see the above message when we run the "docker run" command without specifying a user (even the shiny-server.conf has specified "run_as shiny;")
We can use '''docker run -p 3838:3838 --user shiny rocker/shiny''' to avoid the warning. '''Note: If you do this, make sure any mounted volumes (like your app or log folders) are readable/writable by the shiny user (UID 999 by default).'''
== Shiny + Docker + renv ==
<ul>
<li>[https://r-craft.org/renv-with-docker-how-to-dockerize-a-shiny-application-with-an-reproducible-environment/ Renv with Docker: How to Dockerize a Shiny Application with an Reproducible Environment]
<syntaxhighlight lang="sh">
# Base R Shiny image
FROM rocker/shiny:4.4.3  # rocker/shiny-verse:4.4.3
# Make a directory in the container
RUN mkdir /home/shiny-app
# Install Renv
RUN R -e "install.packages('renv', repos = c(CRAN = 'https://cloud.r-project.org'))"
# Copy Renv files and Shiny app
WORKDIR /home/shiny-app/
RUN mkdir -p renv
COPY app.R app.R
COPY renv.lock renv.lock
COPY .Rprofile  .Rprofile
COPY renv/activate.R renv/activate.R
COPY renv/settings.json renv/settings.json
# Restore the R environment
RUN R -e "renv::restore()"
# Expose the application port
EXPOSE 3838
# Run the R Shiny app
CMD Rscript /home/shiny-app/app.R
</syntaxhighlight>
<li>[https://rstudio.r-universe.dev/articles/renv/docker.html Using renv with Docker]
</ul>
== shiny2docker ==
[https://www.r-bloggers.com/2025/06/containerizing-shiny-apps-with-shiny2docker-a-step-by-step-guide/ Containerizing Shiny Apps with {shiny2docker}: A Step-by-Step Guide]
= Landing page =
<ul>
<li>We can create an HTML file in /srv/shiny-server directory as the landing page where each app is under a sub-directory.
<li>[https://apps.machlis.com/ R Shiny Apps by Sharon Machlis]
<li>[https://cran.r-project.org/web/packages/shinyLP/index.html shinyLP] package. Bootstrap Landing Home Pages for Shiny Applications
<li>[https://docs.rstudio.com/shiny-server/#host-a-directory-of-applications-1 Host a directory of applications] from Shiny Server Professional v1.5.17 Administrator's Guide
<li>[https://cloud.r-project.org/web/packages/shiny.router/index.html shiny.router]
* https://www.appsilon.com/post/shiny-router-020
* https://www.appsilon.com/rhinoverse
<li>Landing page vs dashboard
{| class="wikitable"
|+ '''Landing Page vs Dashboard in Shiny'''
! Feature !! Landing Page 🛬 !! Dashboard 📊
|-
| Purpose || Welcome users, guide them to other sections || Display data, interact with analysis tools
|-
| Functionality || Navigational or informational || Analytical, interactive, and data-driven
|-
| User Role || Acts like a ''homepage or gateway'' || Acts like a ''workspace or control panel''
|-
| Contains || Logos, app links, mission, buttons || Charts, plots, tables, controls
|-
| Example Use || "Welcome to the App Suite! Choose a Tool." || "View sales trends, filter by date."
|-
| UI Type || Often uses HTML-like layout (''shinyLP'', ''fluidPage'') || Uses layout tools like ''shinydashboard'', ''bs4Dash''
|}
</li>
</ul>


= Dashboard =
= Dashboard =
Line 401: Line 684:


= Gallery =
= Gallery =
* https://shiny.posit.co/r/gallery/
* https://github.com/rstudio/shiny-examples
* https://github.com/rstudio/shiny-examples
<pre>
<pre>
Line 605: Line 889:
http://padamson.github.io/r/shiny/2016/03/13/install-required-r-packages.html
http://padamson.github.io/r/shiny/2016/03/13/install-required-r-packages.html


= Icons =
= www directory =
<ul>
<li>For static web resources served directly by the browser:
* Images displayed via <img src="..."> tags
* CSS files, JavaScript files
* Files accessed directly via URL
* These MUST go in the www directory
 
<li>For file downloads using downloadHandler():
* Files can be located anywhere accessible to the R process (see [https://gist.github.com/arraytools/c8707f86fa8e7200e5f0c830ecf49927 this example] on github)
* The www directory is NOT required
* You can put files in the root directory, subdirectories, or anywhere else
</ul>
 
== Icons ==
<ul>
<ul>
<li>[https://appsilon.com/r-shiny-fontawesome-icons/ R Shiny & FontAwesome Icons – How to Use Them in Your Dashboards]
<li>[https://appsilon.com/r-shiny-fontawesome-icons/ R Shiny & FontAwesome Icons – How to Use Them in Your Dashboards]
Line 635: Line 933:
</ul>
</ul>


= How do I add a favicon to my Shiny app =
== How do I add a favicon to my Shiny app ==
Adding a favicon to your Shiny app can be done by placing the favicon file in the www directory of your Shiny app and then using the tags$link function in your UI to link to it. Here’s how you can do it:
Adding a favicon to your Shiny app can be done by placing the favicon file in the www directory of your Shiny app and then using the tags$link function in your UI to link to it. Here’s how you can do it:


Line 724: Line 1,022:
== A Guide to Benchmarking Memory Usage ==
== A Guide to Benchmarking Memory Usage ==
[https://www.r-bloggers.com/2023/11/maximizing-efficiency-a-guide-to-benchmarking-memory-usage-in-shiny-apps/ Maximizing Efficiency: A Guide to Benchmarking Memory Usage in Shiny Apps]
[https://www.r-bloggers.com/2023/11/maximizing-efficiency-a-guide-to-benchmarking-memory-usage-in-shiny-apps/ Maximizing Efficiency: A Guide to Benchmarking Memory Usage in Shiny Apps]
== Reproducible ==
* '''shinyscholar''' package on [https://github.com/simon-smart88/shinyscholar Github] and on [https://cran.r-project.org/web/packages/shinyscholar/index.html CRAN]


= Recreating a Shiny App with Flask =
= Recreating a Shiny App with Flask =
Line 847: Line 1,148:
* [https://www.biorxiv.org/content/10.1101/2023.06.09.544161v1 PlotS]: web-based application for data visualization and analysis
* [https://www.biorxiv.org/content/10.1101/2023.06.09.544161v1 PlotS]: web-based application for data visualization and analysis
* [https://c4tb.github.io/shinyExprPortal/ shinyExprPortal]. Deploy interactive Shiny portals for exploration and showcase of analysis of molecular expression and phenotype data using a configuration file.
* [https://c4tb.github.io/shinyExprPortal/ shinyExprPortal]. Deploy interactive Shiny portals for exploration and showcase of analysis of molecular expression and phenotype data using a configuration file.
* [https://github.com/robert-norberg/shinybody shinybody]- an Interactive Anatomography Widget for Shiny
* Games
* Games
** [https://pacha.dev/blog/2024/05/10/index.html If Doom runs everywhere, it must run on Shiny]
** [https://pacha.dev/blog/2024/05/10/index.html If Doom runs everywhere, it must run on Shiny]

Latest revision as of 10:43, 1 November 2025

Preliminary

The following is what we see on a browser after we run an example from shiny package. See http://rstudio.github.com/shiny/tutorial/#hello-shiny. Note that the R session needs to be on; i.e. R command prompt will not be returned unless we press Ctrl+C or ESC.

More shiny examples can be found on https://github.com/rstudio/shiny-examples 188 shiny-examples (note this is not what runExample("08_html") used. runExample() used local files that contain only 11 examples). The local directory is /Library/Frameworks/R.framework/Versions/4.2/Resources/library/shiny/ for R 4.2.x on macOS.

shiny depends on websockets, caTools, bitops, digest packages.

Q & A:

  • Tutorial: http://wch.github.io/shiny/tutorial/
  • Layout: http://shiny.rstudio.com/articles/layout-guide.html
  • Q: If we run runExample('01_hello') in Rserve from an R client, we can continue our work in R client without losing the functionality of the GUI from shiny. Question: how do we kill the job?
  • If I run the example "01_hello", the browser only shows the control but not graph on Firefox? A: Use Chrome or Opera as the default browser.
  • Q: How difficult to put the code in Gist:github? A: Just create an account. Do not even need to create a repository. Just go to http://gist.github.com and create a new gist. The new gist can be secret or public. A secret gist can not be edited again after it is created although it works fine when it was used in runGist() function.

Resources

Cheatsheet

https://shiny.posit.co/r/articles/start/cheatsheet/

Deployment

R Shiny Deployment: 5 Options for Individuals and Enterprises

Deploy to run locally

Run Shiny Apps Locally 2021

Follow the instruction here, we can do as following (Tested on Windows OS)

  1. Create a desktop shortcut with target "C:\Program Files\R\R-3.0.2\bin\R.exe" -e "shiny::runExample('01_hello')" . We can name the shortcut as we like, e.g. R+shiny
  2. Double click the shortcut. The Windows Firewall will be popped up and say it block some features of the program. It does not matter if we choose Allow access or Cancel.
  3. Look at the command prompt window (black background console window), it will say something like
    Listening on port 7510
    at the last line of the console.
  4. Open your browser (Chrome or Firefox works), and type the address http://localhost:7510. You will see something magic happen.
  5. If we don't want to play with it, we can close the browser and close the command console (hit 'x')too.

How to run an R shiny app

  • Building Shiny apps – an interactive tutorial by Dean Attali
  • Different ways of running an R shiny app from a desktop:
    • Click "Run App" in RStudio
    • Call shinyApp().
      • options(browser = "/usr/bin/firefox")
      • shinyApp(ui=ui, server=server, options = list(port = 3838)) create a Shiny app object. Printing the object or passing it to runApp() will run the app.
    • Call runApp()
      • runApp(shinyApp(ui=ui, server=server, options = list(port = 3838))
      • runApp("app.R")
      • runApp("~/Directory"). This also works if we replaced a directory with an R file.
      • R -e "shiny::runApp('~/shinyapp')" from a terminal
  • An example of "app.R". Edit a table via the "DT" package.
  • Turn a shiny application into a tablet or desktop app

rmarkdown::run() instead of rmarkdown::render()

Use rmarkdown::run("XXX.Rmd") file. If you use the render() function, you will receive an error "Error: path for html_dependency not provided Execution".

RInno

Installs shiny apps packaged as stand-alone Electron apps using Inno Setup, an open source software that builds installers for Windows programs only.

Deploy on cloud

https://www.r-bloggers.com/deploying-r-rstudio-and-shiny-applications-on-unbuntu-server/

Shiny server series part 1: setting up. It includes setting up A- and CNAME records on DigitalOcean.

Deploy on Github Pages: shinylive

Deploy to Digital Ocean

How to deploy Shiny application to Digital Ocean using GitHub Actions

Deploy on shinyapps.io: rsconnect package

About the account

Shinyapps.io can accept google account to sign up.

Note:

  1. Two commands are needed to upload an app:
    • rsconnect::setAccountInfo() the full command including name/token/secret can be copied from Account dashboard - Token page.
    • rsconnect::deployApp() [assume we are in the right working directory]. If the machine contains several accounts, we can use deployApp(account = "XXXX") to specify the account we want to deploy the app. After successful deployment, the browser will open the URL for our app.
  2. After we run rsconnect() command to deploy our apps, a new subfolder rsconnect will be created under our app folder. I add this folder to .gitignore file. But it seems this file/folder does not contain any secret information. So not worry.
  3. The rsconnect stores account information. If we get the app from another account make sure to delete this subfolder before we run rsconnect::deployApp(); otherwise we will get an error message Error: HTTP 403 .... Forbidden'; see I can't deploy my app with a name that was used in a previous deleted app.
  4. For the shiny apps we uploaded to shinyapps.io, we can download them back. The download bundle will also include packrat subfolder (packrat.lock file and desc subfolder). See R packages → packrat for more about packrat.

Caveats:

  1. I cannot upload my shiny app shinySurvival when it contains data in a subdirectory.
  2. When the app is running perfectly locally, it gives some errors when it is deployed to the shinyapps.io. Looking at the app log does not help too much.

deployApp()

  • Choose which files ignored deploy to shinyapps.io. See Deploy to Shinyapps.io from Github Actions
    deployApp(, appFiles= c("app.R" #, you can specify which files to deploy, 
                                     #or keep this NULL to deploy everything
                             ),
              appName = error_on_missing_name("MASTERNAME"),
              appTitle = "shinyapplication")
    

Packages

  • The R packages our shiny app uses will be automatically downloaded by shinyapps.io service. See the package dependencies section on http://shiny.rstudio.com/articles/shinyapps.html and Using your R packages in the cloud.
  • When you deploy your application, the rsconnect package detects the packages that your application uses by looking for explicit library() calls within your application. Be aware that you should not have an explicit install.packages() call within your ui.R or server.R files.
  • Currently the shinyapps.io service supports deploying packages installed from CRAN, GitHub, and BioConductor.
  • rsconnect::appDependencies() - Recursively detect all package dependencies for an application.
  • Error when trying to deploy to shinyapps.io: Application depends on package "package" but it is not. You have to fool the shinyapps (or rsconnect) package a bit so that it does not detect package as a literal package name.
    do.call(library, list(package = package, character.only = TRUE))
    
  • How to specify package versions when deploying Shiny app to shinyapps.io? See the next item.
  • Shiny app which depends on package on GitHub? You should not install packages inside your shiny app, just install it locally and rsconnect will figure out how to install it based on your local library, you just have to load the library inside your app. Remember packageDescription() records all information even a package installed from a specific commit from Github repository.
  • (Is this outdated?) In order for BioConductor packages to install succesfully on shinyapps.io, the repos option must be configured, either directly or by using setRepositories(), to include the BioConductor repositories in addition to CRAN. setRepositories()
    setRepositories(addURLs = c(BioC = "https://bioconductor.org/packages/3.8/bioc"))
    
  • Deploy shiny app using custom package. Also use renv or packrat package.
  • How to manage R package dependencies for shiny app deployment (docker) packrat
  • Deploying packrat projects to Shiny Server Pro packrat
  • Building Web Apps with R Shiny ebook
  • Deploy to Shinyapps.io from Github Actions

Deploying a development version of a shiny app

rsconnect::deployApp(..., appName="MyApp")
rsconnect::deployApp(..., appName="MyApp_dev")

Shiny server installation

Each app directory needs to be copied to /srv/shiny-server/ (which links to /opt/shiny-server/) directory using sudo.

The default port is 3838. That is, the remote computer can access the website using http://xxx.xxx.x.xx:3838/AppName.

Release

Shiny Server 1.5.16 Update 2021-01-03

Ubuntu & firewall

RHEL/CentOS 7

https://www.vultr.com/docs/how-to-install-shiny-server-on-centos-7

Raspberry Pi

R

sudo nano /etc/apt/sources.list
# deb http://archive.raspbian.org/raspbian/ stretch main 

sudo apt-get update
sudo apt-get install r-base r-base-core r-base-dev

Shiny-server

sudo apt-get install cmake

sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\"" 

git clone https://github.com/rstudio/shiny-server.git
cd shiny-server
mkdir tmp
cd tmp
DIR=`pwd`
PATH=$DIR/../bin:$PATH

PYTHON=`which python`
$PYTHON --version

cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DPYTHON="$PYTHON" ../

make
mkdir ../build
(cd .. && ./bin/npm --python="$PYTHON" install)
(cd .. && ./bin/node ./ext/node/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js --python="$PYTHON" rebuild)

sudo make install

sudo ln -s /usr/local/shiny-server/bin/shiny-server /usr/bin/shiny-server

sudo useradd -r -m shiny

sudo mkdir -p /var/log/shiny-server
sudo mkdir -p /srv/shiny-server
sudo mkdir -p /var/lib/shiny-server
sudo chown shiny /var/log/shiny-server
sudo mkdir -p /etc/shiny-server

cd /etc/shiny-server/
sudo wget http://withr.me/misc/shiny-server.conf

sudo shiny-server

http://192.168.X.XXX:3838

建立 server.R 及 ui.R 程式

cd /srv/shiny-server
mkdir hello_shiny
cd hello_shiny
# 分別建立 server.R 及 ui.R

Running shiny server as non-root: run_as

Google analytics

https://docs.rstudio.com/shiny-server/#google-analytics

Reverse proxy: Deploy your own shiny server

Shiny https: Securing Shiny Open Source with SSL

Security

Securing Shiny Server with Caddy

Shiny for Python

https://shiny.rstudio.com/py/

Shiny Assistant

Simplifying Parts Of A Shiny App by Creating Functions

Simplifying Parts Of A Shiny App by Creating Functions

shinyuieditor

shinyuieditor package

Shiny UI Prototype Builder

designer package

How to Build a Data Analysis App in R Shiny

How to Build a Data Analysis App in R Shiny

global.R

The R Shiny packages you need for your web apps

https://www.r-bloggers.com/2017/07/the-r-shiny-packages-you-need-for-your-web-apps/

Other web apps

Ten simple rules for researchers who want to develop web apps

Shiny + Docker

Quick run

app.R

library(shiny)
ui <- fluidPage(
  textInput("name", "Enter your name:"),
  textOutput("greeting")
)

server <- function(input, output) {
  output$greeting <- renderText({
    paste("Hello,", input$name)
  })
}

shinyApp(ui, server)
docker run --rm -p 3838:3838 \
  -v "$(pwd)/app.R:/srv/shiny-server/app.R" \
  rocker/shiny

Bonus: an even shorter app.R

library(shiny)
shinyApp(ui = fluidPage("Hi"), server = function(input, output) {})

/etc/shiny-server/shiny-server.conf

nano shiny-server.conf
Note: run_as shiny; is required for avoiding the error: Error loading config: Required "run_as" directive not present or has no users.

run_as shiny;

server {
  listen 8080;   # Change from 3838 to any available port

  location / {
    site_dir /srv/shiny-server;
    log_dir /var/log/shiny-server;
  }
}

Then run the following. This will overwrite the default /etc/shiny-server/shiny-server.conf file

docker run -it --rm -p 3838:8080 \
  -v $(pwd)/shiny-server.conf:/etc/shiny-server/shiny-server.conf \
  --name shiny \
  rocker/shiny

Idle time

Define app_idle_timeout in shiny-server.conf.

server {
  listen 3838;

  # Define a location at the base URL
  location / {
    site_dir /srv/shiny-server;
    log_dir /var/log/shiny-server;

    # Optional: disconnect idle sessions after 15 minutes
    app_idle_timeout 900;
  }
}

shiny-server version

docker run --rm rocker/shiny shiny-server --version

Multiple connections

  • Example 1: show session token
    library(shiny)
    
    server <- function(input, output, session) {
      output$token <- renderText({
        paste("Your session token is:", session$token)
      })
    }
    
    ui <- fluidPage(
      textOutput("token")
    )
    
    shinyApp(ui, server)
    
  • Example 2: multiple connections are run independently
    library(shiny)
    
    ui <- fluidPage(
      titlePanel("Test: Simultaneous Connections"),
      verbatimTextOutput("session_info"),
      actionButton("click", "Click me"),
      textOutput("click_count")
    )
    
    server <- function(input, output, session) {
      # Per-user reactive counter
      counter <- reactiveVal(0)
    
      observeEvent(input$click, {
        counter(counter() + 1)
      })
    
      output$click_count <- renderText({
        paste("You clicked", counter(), "times")
      })
    
      output$session_info <- renderPrint({
        list(
          session_id = session$token,
          timestamp = Sys.time()
        )
      })
    }
    
    shinyApp(ui, server)
    

Build rocker/shiny image

git clone https://github.com/rocker-org/rocker-versioned2.git
docker build -t shiny:4.5.1 -f dockerfiles/shiny_4.5.1.Dockerfile .

Only the R versions defined in the bakefiles directory will be built. The repository file structure is

  • build: templates and generation scripts that produce those per-version Dockerfiles. "matrix/all.json" contains R versions that will be used to build images but all files under "matrix" are automatically generated.
  • bakefiles: generated *.docker-bake.json (such 4.4.3.docker-bake.json) files used by Docker BuildKit to define how multiple images (including R versions) are built in batches.
  • dockerfiles: generated Dockerfiles used to build each image
  • Makefile
  • scripts: installer scripts (e.g., install_shiny_server.sh) used inside those Dockerfiles
  • tests

To build an image based on an old R version (eg R 4.4.0 released 2024/4/24),

  • Method 1. Use release version. https://github.com/rocker-org/rocker-versioned2/releases. R 4.4.0 corresponds to 3a856a4.
    git checkout 3a856a4
    
  • Method 2. Find the commit hash nuber.
    git log -S "4.4.0" -- dockerfiles/
    # OR
    git log -p -- build/matrix/all.json  # Show diffs
    

    to find out the hash number. After that,

    git checkout 42772bd
    # Extra:
    git show --name-only 42772bd # show changed files
    

    To move back to the master branch,

    git checkout master
    git branch
    

WARN shiny-server - Running as root unnecessarily is a security risk

We may see the above message when we run the "docker run" command without specifying a user (even the shiny-server.conf has specified "run_as shiny;")

We can use docker run -p 3838:3838 --user shiny rocker/shiny to avoid the warning. Note: If you do this, make sure any mounted volumes (like your app or log folders) are readable/writable by the shiny user (UID 999 by default).

Shiny + Docker + renv

  • Renv with Docker: How to Dockerize a Shiny Application with an Reproducible Environment
    # Base R Shiny image
    FROM rocker/shiny:4.4.3   # rocker/shiny-verse:4.4.3
    
    # Make a directory in the container
    RUN mkdir /home/shiny-app
    
    # Install Renv
    RUN R -e "install.packages('renv', repos = c(CRAN = 'https://cloud.r-project.org'))"
    
    # Copy Renv files and Shiny app
    WORKDIR /home/shiny-app/
    
    RUN mkdir -p renv
    COPY app.R app.R
    COPY renv.lock renv.lock
    COPY .Rprofile  .Rprofile
    COPY renv/activate.R renv/activate.R
    COPY renv/settings.json renv/settings.json
    
    # Restore the R environment
    RUN R -e "renv::restore()"
    
    # Expose the application port
    EXPOSE 3838
    
    # Run the R Shiny app
    CMD Rscript /home/shiny-app/app.R
  • Using renv with Docker

shiny2docker

Containerizing Shiny Apps with {shiny2docker}: A Step-by-Step Guide

Landing page

  • We can create an HTML file in /srv/shiny-server directory as the landing page where each app is under a sub-directory.
  • R Shiny Apps by Sharon Machlis
  • shinyLP package. Bootstrap Landing Home Pages for Shiny Applications
  • Host a directory of applications from Shiny Server Professional v1.5.17 Administrator's Guide
  • shiny.router
  • Landing page vs dashboard
    Landing Page vs Dashboard in Shiny
    Feature Landing Page 🛬 Dashboard 📊
    Purpose Welcome users, guide them to other sections Display data, interact with analysis tools
    Functionality Navigational or informational Analytical, interactive, and data-driven
    User Role Acts like a homepage or gateway Acts like a workspace or control panel
    Contains Logos, app links, mission, buttons Charts, plots, tables, controls
    Example Use "Welcome to the App Suite! Choose a Tool." "View sales trends, filter by date."
    UI Type Often uses HTML-like layout (shinyLP, fluidPage) Uses layout tools like shinydashboard, bs4Dash

Dashboard

shinydashboard

flexdashboard

shinyalert: create pretty popup messages (modals) in Shiny

shinyalert

shinyjs

shinyjs

Dash bio for R

Introducing Dash Bio for R

Theme

shinytheme

bslib

R Shiny bslib – How to Work With Bootstrap Themes in Shiny

bootstraplib

How to use bootstraplib's Live Theme Previewer to customize Shiny apps?

shiny + databases

tags, hyperlinks

dates

websocket

CentOS

Gallery

git clone https://github.com/rstudio/shiny-examples.git
shiny::runApp("~/github/shiny-examples/018-datatable-options/")

Persistent data storage in Shiny apps

http://deanattali.com/blog/shiny-persistent-data-storage/

multiple outputs to mainPanel

https://stackoverflow.com/a/27383312. Or use fluidRow() to expand the output in one tabPanel.

ui <- navbarPage("My App",
  tabPanel("Lasso",
     sidebarLayout(
       sidebarPanel(
         ...
       ),

       mainPanel(
         tabsetPanel(
          tabPanel("CV plot", plotOutput("plotLasso")),
          tabPanel("Lasso fitting", 
                   #verbatimTextOutput("fitLasso"))
                   fluidRow(
                      column(12, TextOutput("fitLasso", inline=T)),
                      column(12, verbatimTextOutput("fitLasso2"))
                   ))
         )
       ) # close mainPanel
   ) # close sidebarLayout
  ), # close tabPanel Lasso
)  #close navbar page

server <- function(input, output, session) {
  output$fitLasso <- renderText({ })
  output$fitLasso2 <- renderPrint({ })
}

shinyApp(ui, server)

navbarPage

How to get the selected Tab-ID in a navbarPage with modules

HTML

  • Customize your UI with HTML
    # adding the new div tag to the sidebar            
          tags$div(class="header", checked=NA,
                   tags$p("Ready to take the Shiny tutorial? If so"),
                   tags$a(href="shiny.rstudio.com/tutorial", "Click Here!")
    
  • Build your entire UI with HTML. This seems to be a more complicated approach at first glance.
    <application-dir>
    |-- app.R
    |-- www
        |-- index.html
    

    and "app.R"

    # ui is defined in the HTML file
    
    server <- function(input, output) { }
    
    shinyApp(ui = htmlTemplate("www/index.html"), server)
    
  • HTML templates
  • Shiny HTML Tags Glossary

Conditional input

Upload a file/files

reactive

actionButton and isolate

actionButton and eventReactive*

R Shiny App Tutorial | eventReactive() demo | Create dependency on actionButton

actionButton, observeEvent and reactiveValues

  • ?reactiveValues
  • Based on the following 2 examples. It seems
    • reactiveValues() and observeEvent() work together.
    • reactiveValues() will create a global variable and its value will be changed based on an actionButton.
    • the effect of observeEvent() + reactiveValues() is similar to eventReactive() if we don't consider the situation that the new value depends on the old value.
  • reactiveValues example
    text_reactive <- reactiveValues(
        text = "No text has been submitted yet."
    )
    
    observeEvent(input$submit, {
        text_reactive$text <- input$user_text
    })
    
    output$text <- renderText({
        text_reactive$text
    })
    

    eventReactive() way:

    text <- eventReactive(input$submit, {
            input$user_text
    })
    output$text <- renderText({
      text()
    })
    
  • reactiveValues() in R Shiny - Example 1 - A counter (video)
    counter <- reactiveValues(countervalue = 0)
    
    observeEvent(input$add1, 
        counter$countervalue <- counter$countervalue + 1
    
    output$counter <- renderText({
        counter$countervalue 
    })
    

    The following code will break (Error in : C stack usage 7969216 is too close to the limit). So this is the case eventReactive() can't replace reactiveValues()!

    countervalue <- eventReactive(input$add1, {
               countervalue() + 1
    })
    output$counter <- renderText({
        countervalue()
    })
    

Dynamic UI

eventReactive()

Files

shinyFiles

shinyFiles package. This package extends the functionality of shiny by providing an API for client side access to the server file system. As many shiny apps are run locally this is equivalent to accessing the filesystem of the users own computer, without the overhead of copying files to temporary locations that is tied to the use of fileInput().

Password protection

Install all required R packages

http://padamson.github.io/r/shiny/2016/03/13/install-required-r-packages.html

www directory

  • For static web resources served directly by the browser:
    • Images displayed via <img src="..."> tags
    • CSS files, JavaScript files
    • Files accessed directly via URL
    • These MUST go in the www directory
  • For file downloads using downloadHandler():
    • Files can be located anywhere accessible to the R process (see this example on github)
    • The www directory is NOT required
    • You can put files in the root directory, subdirectories, or anywhere else

Icons

  • R Shiny & FontAwesome Icons – How to Use Them in Your Dashboards
  • Image not showing R Shiny (displayed as broken)
    • Put the png file in the www directory
    • Put your R code in the app.R file and run it through runApp() or the Run App icon in RStudio. It does not work if we call it by shinyApp() function.
  • Example
    library(shiny)
    library(survival)
    
    ui <- fluidPage(
       titlePanel(
          title = tags$div(tags$img(src = "icon.png", height = "32px", width = "32px"), 
                           "Interactive Kaplan Meier Plot", 
                           style = "background-color: black; color: white; padding: 10px;")),
       sidebarLayout(
          sidebarPanel(
             radioButtons("survivalType", "Choose survival data type:",
                          choices = list("Overall Survival" = "os", "Progression Free Survival" = "pfs"),
                          selected = "os")
          ),
          mainPanel(
             plotOutput("kmPlot")
          )
       )
    )

How do I add a favicon to my Shiny app

Adding a favicon to your Shiny app can be done by placing the favicon file in the www directory of your Shiny app and then using the tags$link function in your UI to link to it. Here’s how you can do it:

  1. Place your favicon file (e.g., favicon.ico) in the www directory of your Shiny app.
  2. In your UI, add the following line inside the fluidPage or navbarPage function:
    tags$head(tags$link(rel = "shortcut icon", href = "favicon.ico", type = "image/x-icon"))
    
  3. Here’s an example of how it might look in a Shiny app:
    ui <- fluidPage(
       titlePanel("My Shiny App"),
       tags$head(tags$link(rel = "shortcut icon", href = "favicon.ico", type = "image/x-icon")),
       # Rest of your UI code...
    )
    
    server <- function(input, output) {
       # Your server code...
    }
    
    shinyApp(ui = ui, server = server)
    

Websites to convert an image to a favicon:

Building a Shiny App as a Package

Collapsible menu

Three R Shiny tricks to make your Shiny app shines (2/3): Semi-collapsible sidebar

Color picker

https://github.com/daattali/colourpicker

Simulations

Monte Carlo Shiny

Tables

Multimedia

Shiny and Reactive Multimedia

Math formula

shinyMatrix

Tree

shinyTree

D3

Time series

dygraphs

CSS

Debug

Talks

Shiny in production: Principles, practices, and tools - Joe Cheng 2019

Tips

Shiny tips & tricks for improving your apps and solving common problems by Dean Attali.

Adding a website

Adding a website next to your Shiny server

A Guide to Benchmarking Memory Usage

Maximizing Efficiency: A Guide to Benchmarking Memory Usage in Shiny Apps

Reproducible

Recreating a Shiny App with Flask

Recreating a Shiny App with Flask

Webhook

Flask, a popular web framework.

This example assumes that you have a server running at https://yourserver.com/webhook that is set up to receive POST requests.

from flask import Flask, request
app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def respond():
    print(request.json)
    return {'status': 'success'}, 200

if __name__ == '__main__':
    app.run(port=5000, debug=True)

In this example, whenever a POST request is made to https://yourserver.com/webhook, the respond function is triggered. This function prints the JSON payload of the request and returns a success status. The JSON payload is the data sent by the application that triggered the webhook. This could be any data related to the event that occurred in the other application. For instance, if the webhook was triggered by a new user signing up, the JSON payload might contain the new user’s details.

You can use the curl command to send a POST request to your local server. Here’s an example:

curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://localhost:5000/webhook

Modularize your shiny apps

A Shiny-app Serves as Shiny-server Load Balancer

ggtips: adding tooltips boxes to ggplots

Adds interactive tooltip boxes to ggplots (standalone or rendered in Shiny)

Shinyloadtest tools for load testing Shiny applications

shinytest

New in RStudio 1.2: record and run tests for your Shiny code right inside the IDE with the shinytest package

Shiny-server System Performance Monitoring for Open Source Edition

Build a static website with R Shiny

Build a static website with R Shiny

Embed a shiny app on your website

<iframe width="750" height="650" scrolling="no" frameborder="no" src="https://hinkelman.shinyapps.io/shiny-survival-covariate/"> </iframe>

Machine learning examples

How To Share Your Machine Learning Models With Shiny

Real Shiny Examples

Interesting Examples

Scaling

Long run with Shiny

Track Shiny App User Activity With the RStudio Connect Server =

Track Shiny App User Activity With the RStudio Connect Server API

Standalone application

Photon: Building an Electron-Shiny app using a simple RStudio addin

Mobile

shinyMobile