R6Class-based component architecture framework for Shiny apps
The component’s design is based on AngularJS, which can emit events from the root to its children and broadcast events from children to parents. It gives better structure to non-trivial Shiny apps that need to have many different parts.
Basic usage
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")))
)
}
)
)Documentation
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
Contributors
- Jakub T. Jankiewicz - main author
- Michał Jakubczak
License
Copyright (c) 2019-2021 Genentech, Inc.
Released under the MIT License. See LICENSE.md for the full text.