Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ixpantia/tower
Ergonomic middleware for Shiny applications
https://github.com/ixpantia/tower
Last synced: 8 days ago
JSON representation
Ergonomic middleware for Shiny applications
- Host: GitHub
- URL: https://github.com/ixpantia/tower
- Owner: ixpantia
- License: other
- Created: 2024-01-31T02:58:12.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2024-10-22T02:07:49.000Z (about 2 months ago)
- Last Synced: 2024-11-06T09:09:17.418Z (about 1 month ago)
- Language: R
- Homepage: https://ixpantia.github.io/tower/
- Size: 4.51 MB
- Stars: 16
- Watchers: 2
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- jimsghstars - ixpantia/tower - Ergonomic middleware for Shiny applications (R)
README
# tower
[![R-CMD-check](https://github.com/ixpantia/tower/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ixpantia/tower/actions/workflows/R-CMD-check.yaml)
Dead simple middleware for R Shiny.
## Summary
`tower` is a simple library for adding middleware to Shiny applications.
It is inspired by the [tower](https://docs.rs/tower/latest/tower/) crate for Rust.
It is designed to enable package authors and Shiny developers to extend
Shiny a little bit more than what is usually possible.You can use `tower` to add middlewares that forward, modify, or intercept
requests in Shiny applications. This can be useful for adding logging, authentication,
caching, or routing to your Shiny applications.## Installation
You can install the development version of `tower` from GitHub with:
``` r
# install.packages("remotes")
remotes::install_github("ixpantia/tower")
```## Example
We may want to add a new route to our Shiny application that adds a count
to a counter every time a user visits the route. We can do this with `tower`
by adding a middleware that intercepts the request and increments the counter.``` r
library(shiny)
library(tower)# Counter environment
global_counter <- new.env()
global_counter$count <- 0# Middleware to increment the counter
increment_counter <- function(req) {
global_counter$count <- global_counter$count + 1
response_builder() |>
add_body(paste("Counter is now", global_counter$count)) |>
build_response()
}# A very empty Shiny app (not necesarry for the demo)
ui <- fluidPage()
server <- function(input, output, session) {}shinyApp(ui, server) |>
create_tower() |>
add_get_route("/counter", increment_counter) |>
build_tower()
```If you run the code above and visit the route `/counter` in your browser,
you will see the counter increment every time you visit the route.## How it works
Basically, `tower` adds layers to a Shiny application. A layer is a function
that takes a request and returns either a response or NULL. If a layer returns
a response, the response is sent to the client and the request is not forwarded
to the next layer. If a layer returns NULL, the request is forwarded to the next
layer.