R6Class based component architecture framework for Shiny apps
The components design is based on AngularJS that can emit event from root it it's children and broadcast events from child to parents. It give better structure of non trivial shiny apps, that need to have lots of different parts.
git clone https://github.com/Genentech/battery.git
R CMD INSTALL battery
Button <- battery::component(
classname = "Button",
label = NULL,
constructor = function(label = NULL) {
self$label = label
},
render = function() {
shiny::tags$button(self$label)
}
)
App <- battery::component(
classname = "App",
public = list(
constructor = function() {
btn <- Button$new(label = "Click me", parent = self, component.name = "button")
self$output[[ self$ns("root") ]] <- shiny::renderUI({
shiny::tags$div(
shiny::tags$p("click the button"),
btn$render()
)
})
},
render = function() {
tags$div(
titlePanel('Shiny App using Battery R package'),
mainPanel(shiny::uiOutput(self$ns("root")))
)
}
)
)
For full documentation see Battery Components Vignette.
You can also read tutorial about the framework features at DEV.to:
Architecture for Non-Trivial R Shiny Applications
- Jakub T. Jankiewicz - main author
- Michał Jakubczak
Copyright (c) 2019-2021 Genentech, Inc.
Released under MIT license