Running and deployment
How to run a Rhino application?
You can run a Rhino application exactly the same as a regular Shiny app:
- using
shiny::runApp()
- using the “Run app” button in RStudio
How to automatically reload the application during development?
Call options(shiny.autoreload = TRUE)
in your R session. Shiny will monitor the app directory and reload all connected sessions if any changes are detected. More details can be found in Shiny reference.
Note: you have to use shiny::runApp()
for the autoreload to work - using rhino::app()
won’t work. For context see issue #3964 in Shiny.
How to use a specific port when running a Rhino application?
You can:
- set port in
shiny::runApp
, e.g.shiny:runApp(port = 5000)
- add
options(shiny.port = 5000)
to your.Rprofile
file
More details can be found in How-to: Set application run parameters.
How to deploy a Rhino application?
The same as in the case of a regular Shiny app, e.g. you can use “Deploy” button in RStudio IDE.
Differences between Rhino and vanilla Shiny
Where are
server.R
and ui.R
files?
Instead of server.R
and ui.R
, Rhino uses a single file app/main.R
. It includes both the server and UI part of the application. The main difference is that both are already Shiny modules so you need to use namespace (ns
) in the UI part.
Where is the
global.R
file?
Rhino encourages you to work with encapsulated modules instead of using global objects, thus it does not include global.R
file. Instead, objects are by default only available on the level of a particular script. Depending on the context, objects can be shared explicitly, by being passed as an argument or being exported with @export
.
Where should I put
library
calls?
Rhino application doesn’t use library
to load packages. Instead, each script imports its dependencies with box::use
:
box::use(
dplyr, # functions from `dplyr` are available using `$`, e.g. `dplyr$mutate()`
shiny[div, moduleServer, NS], # `div`, `moduleServer`, and `NS` are available (but other functions from `shiny` are not)
)
The only place where you should use library
calls is the dependencies.R
file. You can read more about managing R dependencies in this article.
Where is the
www
directory?
Instead of www
, Rhino uses app/static
. To utilize it, you need to provide the path to your assets that include static
, for example:
img(src = "static/images/appsilon-logo.png")
Common problems
Why doesn’t my
input
trigger the reactive chain?
Rhino uses Shiny modules to encapsulate the whole application, so the id
of every input you create needs to be wrapped in ns
, for example:
box::use(
shiny[NS, textInput],
)
#' @export
ui <- function(id) {
ns <- NS(id)
textInput(
inputId = ns("my_input"),
label = "My Input"
)
}
Why is my
output
not visible?
Rhino uses Shiny modules to encapsulate the whole application, so the id
of every output you create needs to be wrapped in ns
, for example:
box::use(
shiny[moduleServer, NS, renderText, textOutput],
)
#' @export
ui <- function(id) {
ns <- NS(id)
textOutput(ns("text"))
}
#' @export
server <- function(id) {
moduleServer(id, function(input, output, session) {
output$text <- renderText("This is a message!")
})
}
shinyBS
is not working in my Rhino application.
shinyBS
uses the .onAttach()
hook to call shiny::addResourcePath()
which is necessary for its resources (JS and CSS) to be loaded correctly. This hook is never run with box::use()
(normally a library()
call would run it). It is worth noting that the problem will be also present in vanilla Shiny if you only use ::
to access shinyBS
functions (shinyBS
should use .onLoad()
instead).
Workaround: Add the following snippet to your app/main.R
(just below the box::use()
statements is a good place):
# Run the `.onAttach` hook (shinyBS uses it to add a Shiny resource path).
suppressWarnings(library(shinyBS))
You’ll still need to explicitly box::use()
whatever functions you need from shinyBS
(library()
doesn’t work in a box module).
More details can be found here.
I have an R package installed, but
renv::snapshot()
didn’t add it to the renv.lock
file.
In Rhino, renv
only uses packages added to the dependencies.R
file. This way you have full control over what libraries are used by your application. Adding library(your package name)
to the dependencies.R
file should fix the problem.
Check also:
Styling Rhino application
Can I use multiple Sass files?
Yes, you can have any file/directory structure in app/styles
that you desire. The app/styles/main.scss
is the entry point: you’ll need to @use
the other files from main.scss
. Then running rhino::build_sass()
will be sufficient to include the styles in your application.