b_dev

Colin Fay

2024-08-27

Day to day development with {golem}

Now that you’re all set with your project init, time to move to development!

App development should happen through the dev/02_dev.R file, which contains common commands for developing.

Launching the app

To run the app, go to the dev/run_dev.R file, and run the all thing.

dev/02_dev.R

Add dependencies

You can use attachment::att_amend_desc() to parse the code in your .R files, detect @import @importFrom and ::, and fill your DESCRIPTION accordingly.

Note that the {attachment} package should be installed on your machine.

attachment::att_amend_desc()

About package dependencies.

Add modules

The golem::add_module() functions creates a module in the R folder. The file and the modules will be named after the name parameter, by adding mod_ to the R file, and mod_*_ui and mod_*_server to the UI and server functions.

golem::add_module(name = "my_first_module") # Name of the module

The new file will contain:

# mod_UI
mod_my_first_module_ui <- function(id) {
  ns <- NS(id)
  tagList()
}

mod_my_first_module_server <- function(input, output, session) {
  ns <- session$ns
}

## To be copied in the UI
# mod_my_first_module_ui("my_first_module_1")

## To be copied in the server
# callModule(mod_my_first_module_server, "my_first_module_1")

At the end of the file, you will find a piece of code that has to be copied and pasted inside your UI and server functions.

Add function files

golem::add_fct("helpers")
golem::add_utils("helpers")

These two function create R/fct_helpers.R and R/utils_helpers.R, two file you can use to add business logic functions.

Add external files

These functions create external dependencies (JavaScript, CSS and Sass). add_js_file() creates a simple JavaScript file, while add_js_handler() adds a file with a skeleton for shiny custom handlers.

golem::add_js_file("script")
golem::add_js_handler("script")
golem::add_css_file("custom")
golem::add_sass_file("custom")

Note: While the general philosophy of {golem} is being based on the idea that you’re building a package, these functions can be used outside of a {golem} project.

Note that you can also download external CSS and JavaScript files with:

golem::use_external_css_file(url = "url", name = "your_provided_name")
golem::use_external_js_file(url = "url", name = "your_provided_name")

The above has the effect of downloading the file at the specified url and giving it a provided name. If the intent is to use a CDN hosted CSS/JS file then manually add the tag - tags$script(src = "source_of_ur_css/js") in the function golem_add_external_resources in file app-ui.R. The tag can be added inside the tags$head(...) if the intent is to load the js/css file in the <head> of the document or outside it if it is intended in the <body>.

Adding these external resources to your app

You can add any external resource into inst/app/www.

JavaScript and CSS are automatically linked in the golem_add_external_resources() function. If you add other resources (example images), you can link them in the app with the www prefix:

tags$img(src = "www/my.png")

You can also list here the use of other packages, for example useShinyalert() from the {shinyalert} package.

Add a data-raw folder

If you have data in your package:

usethis::use_data_raw()

About data in a package.

Add tests

Add more tests to your application:

usethis::use_test("app")

About testing a package.

Documentation

Vignette

usethis::use_vignette("shinyexample")
devtools::build_vignettes()

About package Vignette.

Code coverage

usethis::use_coverage()

Using {golem} dev functions

There’s a series of tools to make your app behave differently whether it’s in dev or prod mode. Notably, the app_prod() and app_dev() function tests for options( "golem.app.prod") (or return TRUE if this option doesn’t exist).

Setting this options at the beginning of your dev process allows to make your app behave in a specific way when you are in dev mode. For example, printing message to the console with cat_dev().

options("golem.app.prod" = TRUE)
golem::cat_dev("hey\n")
options("golem.app.prod" = FALSE)
golem::cat_dev("hey\n")
#> hey

You can then make any function being “dev-dependent” with the make_dev() function:

log_dev <- golem::make_dev(log)
log_dev(10)
#> [1] 2.302585
options("golem.app.prod" = TRUE)
log_dev(10)