Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/coolbutuseless/tickle
Easily create UIs in base R
https://github.com/coolbutuseless/tickle
Last synced: about 2 months ago
JSON representation
Easily create UIs in base R
- Host: GitHub
- URL: https://github.com/coolbutuseless/tickle
- Owner: coolbutuseless
- License: mit
- Created: 2022-06-03T05:02:28.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2022-06-06T23:44:44.000Z (over 2 years ago)
- Last Synced: 2024-10-12T21:24:48.262Z (2 months ago)
- Language: R
- Homepage: https://coolbutuseless.github.io/package/tickle
- Size: 11.7 MB
- Stars: 123
- Watchers: 6
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.Rmd
- Changelog: NEWS.md
- License: LICENSE
Awesome Lists containing this project
- jimsghstars - coolbutuseless/tickle - Easily create UIs in base R (R)
README
---
output: github_document
---```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.path = "man/figures/README-",
out.width = "100%"
)library(tickle)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Generate the pkgdown documentation
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (FALSE) {
pkgdown::build_site(override = list(destination = "../coolbutuseless.github.io/package/tickle"))
}
```# tickle
![](https://img.shields.io/badge/cool-useless-green.svg)
[![R-CMD-check](https://github.com/coolbutuseless/tickle/workflows/R-CMD-check/badge.svg)](https://github.com/coolbutuseless/tickle/actions)`{tickle}` is a package for creating UIs in base R.
This is an **opinionated abstraction** over the base R package `{tcltk}`.
This package aims to provide:
* a **simplified** UI creation process similar to `shiny`.
* a **modern-looking** visual default.
* **more documentation** to help create common UI elements without resorting to the online tcl/tk
documentation.
* a way to still access the low-level tcl/tk structures in order to achieve
complex effects and customisation.
## What's in the box* An array of `tic_*()` functions for nested creation of a UI specification.
* `render_ui()` to render a UI specification into a window onscreen.
* `reactive_*()` to create reactive values used to transfer values between
the UI and R
* `canvas_*()` functions to do some simple drawing an manipulation on canvas widgets.
## Overview
* Create reactive variables (with `reactive_*()`) in order to pass values between R and the UI. e.g. the
value of the slider, or the text in a text entry box.
* Define callback functions that are called, say, when a button is pressed.
* Create a UI specification by nesting containers and widgets with `tic_*()` calls. This specification can include
* binding callback functions to particular events like mouse buttons or key presses (`bind` argument)
* controlling how widgets are packed within their parent container (`pack` argument)
* Render the UI to an actual object on the screen with `render_ui()`
* The object returned by `render_ui()` can be ignored by beginners. For intermediate/advanced users,
this object is a nested list of `tclObj` objects representing the UI components,
and these can be further manipulated with `{tcltk}` to finesse and configure the UI.## Installation
You can install from [GitHub](https://github.com/coolbutuseless/tickle) with:
``` r
# install.package('remotes')
remotes::install_github('coolbutuseless/tickle')
```## Hello World
Things to note:
* Define a reactive variable for the slider before defining the UI
* UI specificaiton created with nested `tic_*()` calls.
* Some commands (e.g. `tic_button()`) have an explicit command function which
is run when they are activated.
* After defining the UI specificaiton, it is rendered to screen with `render_ui()````{r eval=FALSE}
library(tickle)happiness <- reactive_dbl(40)
ui_spec <- tic_window(
title = "Hello World",
tic_row(
tic_col(
tic_button("Hello", command = function() {message("Hello")}, style = 'primary'),
tic_button("World", command = function() {message("World")})
),
tic_col(
tic_slider(happiness),
tic_label(textvariable = happiness)
)
)
)win <- render_ui(ui_spec)
```## Gallery
| | |
|-----|-----|
| | |
| | |## Examples/Vignettes
Please view the online vignettes for more details on how to use `{tickle}`
* [Introductory Examples](https://coolbutuseless.github.io/package/tickle/articles/helloworld.html)
* [Big example with lots of widgets](https://coolbutuseless.github.io/package/tickle/articles/detailed-example.html)
* [Reactive Values](https://coolbutuseless.github.io/package/tickle/articles/reactive.html)
* [Annotate ggplots (using mouse events)](https://coolbutuseless.github.io/package/tickle/articles/ggreview.html)
* [Pop-up Windows](https://coolbutuseless.github.io/package/tickle/articles/popups.html)
* [Overview of all Widgets & Containers](https://coolbutuseless.github.io/package/tickle/articles/widgets.html)
* [JuliaSet explorer (using keyboard events and rendering to a grid window)](https://coolbutuseless.github.io/package/tickle/articles/juliaset.html)
* [Changing font](https://coolbutuseless.github.io/package/tickle/articles/fonts.html)
* [Understanding widget layout](https://coolbutuseless.github.io/package/tickle/articles/packing.html)
* [Continuous rain drops using an idle callback](https://coolbutuseless.github.io/package/tickle/articles/idle.html)
* [Including images in buttons](https://coolbutuseless.github.io/package/tickle/articles/image.html)## Containers
Containers are ways of grouping multiple widgets.
Containers can be nested within other containers to achieve complex layouts.
| Container | Code/Description |
|---|---|
| |tic_window(...)
Create a top level window |
| |tic_col(A, B, C)
Layout objects in column |
| |tic_row(A, B, C)
Layout objects rowwise|
| |tic_frame(...)
Invisible container. Useful for advanced users who want to customize layout |
| |tic_labelframe(...)
Frame with a a label and usually visible outline |
| |tic_notebook(A, B, C)
Tabbed display |
| |tic_panedwindow(A, B, C)
Layout multiple elements which can be resized as panes|## Widgets
| Widget | Code/Description |
|---|---|
| |tic_label(...)
Display text. If you need headings rather than body text, Use `style = 'h1'` to `style = 'h5'` for different sized text |
| |tic_button(...)
Clickable button. Available `style` options: 'primary', 'seconary', 'info', 'success', 'warning', 'danger', 'light', 'dark' |
| |tic_checkbutton(...)
On/off button (default styling) |
| |tic_checkbutton(...)
On/off button with `style = 'toggle'` |
| |tic_checkbutton(...)
On/off button with `style = 'switch'` |
| |tic_radiobutton(...)
Groups of mutually exclusion options|
| |tic_menubutton(...)
Button which displays a drop-down menu |
| |tic_canvas(...)
General drawing canvas |
| |tic_spinbox(...)
Choose options |
| |tic_combobox(...)
Choose options |
| |tic_textentry(...)
Single line text entry |
| |tic_textbox(...)
Multipe line text entry |
| |tic_progressbar(...)
Progress bar |
| |tic_slider(...)
Slider |## Popups
*Popups* are windows which are initiated separate from the main UI.
| Popup | Code/Description |
|---|---|
| |popup_color_picker()
|
| |popup_messagebox()
|
| |popup_open_file()
|
| |popup_save_file()
|## Canvas
After creating a canvas with `tic_canvas()`, it can be manipulated with the following
commands:* Draw on the canvas
* `canvas_line()`
* `canvas_text()`
* `canvas_rect()`
* `canvas_polygon()`
* `canvas_oval()`
* `canvas_arc()`
* `canvas_plot()` render a plot to the canvas
* `canvas_clear()` clear all objects from the canvas
* `canvas_image()` render an image from a file to the canvas
* `canvas_save()` save the contents of the canvas to an image file.The actual canvas in tcl/tk renders *structured graphics* and it is much more like
SVG or PDF than just a simple array of pixels.The canvas implementation in this package treats the canvas as just a raster
object i.e. a rectangular collection of pixels. This made it easier to write
this package and keep the API/syntax simple, but it doesn't unleash the full
power of the canvas.The effort to write a more complete abstraction over the canvas is
not currently warranted. **Please get in contact if such a facility is important to you.**# Theme
The theme for this package is an adaptaton of the `sun-valley-light`
theme available [from rdbende on github](https://github.com/rdbende/Sun-Valley-ttk-theme).The `sun-valley-light` theme is MIT licensed (see "LICENSE-sun-valley") and has been adapted
into the theme `r-sun-valley-light` included in this package which has the following extra features:* Styles 'h1' through 'h5' for different sized heading text to use with `tic_label()` widgets.
* To use: `tic_label(..., style = 'h1')`
* Standard buttons colours from [Bootstrap](https://getbootstrap.com/docs/4.0/components/buttons/)
to use with `tic_button()` widgets.
* To use: `tic_button(..., style = 'primary')`
* Available styles: primary, secondary, success, danger, warning, info, light, dark## Possible Future Features
The following items are not yet implemented, or incomplete:
* Popup menus when a user right-clicks in the window.
* No access yet to the "grid" geometry layout.
* treeview, listbox and some other widgets## Package Name
* `tcl` is the scripting language
* `tk` is the graphics toolkit for `tcl`
* `tcl/tk` is often how the langauge and toolkit are talked about as a single entity
* `{tcltk}` is the R package interfacing to `tcl/tk`
* `tcl` is often pronounced as "tickle" i.e. `tcl/tk` = "tickle-tee-kay"## Acknowledgements
* R Core for developing and maintaining the language.
* CRAN maintainers, for patiently shepherding packages onto CRAN and maintaining
the repository