---
title: "Getting started with datamods"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Getting started with datamods}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
eval = FALSE
)
```
```{r setup}
library(datamods)
```
The {datamods} package contains modules to work with data in Shiny application, currently the following modules are implemented :
* Import modules : import data from various sources
* Update table structure: select columns to keep, rename variable and convert from a class to anoter (e.g. numeric to character)
* Filter data : interactively filter a `data.frame`
* Validate : check that data respect some expectations (with [package {validate}](https://cran.r-project.org/package=validate))
* Sample data: interactively sample a `data.frame`.
## Import
### From environment
Imports data from the user's global environment or a package environment to retrieve included in it.
It searches for data sets in the global environment and lets the user choose the data to use.
```r
# UI
import_globalenv_ui("myid")
# Server
imported <- import_globalenv_server("myid")
```
### From file
Imports data from an external file. The file can be of any format, csv, xlsx, tsv etc.. Import is performed by package [rio](https://github.com/gesistsa/rio).
In case of Excel files, it gives an option to choose the sheet.
```r
# UI
import_file_ui("myid")
# Server
imported <- import_file_server("myid")
```
### From clipboard
Imports data via copy/paste. Simply copy and paste data from any source.
```r
# UI
import_copypaste_ui("myid")
# Server
imported <- import_copypaste_server("myid")
```
### From Googlesheet
Imports data from a Googlesheet. Use the shareable link to read data.
```r
# UI
import_googlesheets_ui("myid")
# Server
imported <- import_googlesheets_server("myid")
```
### From URL
Imports data from a URL. Only flat data in any format supported by [package rio](https://CRAN.R-project.org/package=rio/vignettes/rio.html#Supported_file_formats).
```r
# UI
import_url_ui("myid")
# Server
imported <- import_url_server("myid")
```
### Usage
All modules are used in the same way in a Shiny application, here is an example:
```r
library(shiny)
library(datamods)
ui <- fluidPage(
tags$h3("Import data with copy & paste"),
fluidRow(
column(
width = 4,
import_copypaste_ui("myid")
),
column(
width = 8,
tags$b("Imported data:"),
verbatimTextOutput(outputId = "status"),
verbatimTextOutput(outputId = "data")
)
)
)
server <- function(input, output, session) {
imported <- import_copypaste_server("myid")
output$status <- renderPrint({
imported$status()
})
output$data <- renderPrint({
imported$data()
})
}
shinyApp(ui, server)
```
All modules have the same return value server-side, a `list` with three slots:
* **status**: a `reactive` function returning the status: `NULL`, `error` or `success`.
* **name**: a `reactive` function returning the name of the imported data as `character`.
* **data**: a `reactive` function returning the imported `data.frame`.
### Modal Window
All modules can be launched at once in a modal window:
Launch the modal server-side with:
```r
observeEvent(input$launch_modal, {
import_modal(
id = "myid",
title = "Import data to be used in application"
)
})
```
See `?import_modal` for a complete example.
## Update Modules
This module allow to dynamically select, rename and convert variables of a dataset.
Some options for converting to date and numeric are available in a dropdown menu.
Return value of the module is a `reactive` function with the update data.
## Validate
When importing data into an application it can be useful to check that data respect some expectations: number of rows/columns, existence of a variable, ... This module allow to validate rules defined with package [validate](https://github.com/data-cleaning/validate).
```r
# UI
validation_ui("validation", display = "inline")
# Server
results <- validation_server(
id = "validation",
data = dataset,
n_row = ~ . > 20, # more than 20 rows
n_col = ~ . >= 3, # at least 3 columns
rules = myrules
)
# Rules are defined as follow:
myrules <- validator(
is.character(Manufacturer) | is.factor(Manufacturer),
is.numeric(Price),
Price > 12, # we should use 0 for testing positivity, but that's for the example
!is.na(Luggage.room),
in_range(Cylinders, min = 4, max = 8),
Man.trans.avail %in% c("Yes", "No")
)
# Add some labels
label(myrules) <- c(
"Variable Manufacturer must be character",
"Variable Price must be numeric",
"Variable Price must be strictly positive",
"Luggage.room must not contain any missing values",
"Cylinders must be between 4 and 8",
"Man.trans.avail must be 'Yes' or 'No'"
)
# you can also add a description()
```
Validation results can be displayed in a dropdown menu (above left) or inline where the module is called.
The return value server-side is a list with the following items:
* **status**: a reactive function returning the best status available between "OK", "Failed" or "Error".
* **details**: a reactive function returning a list with validation details.
## Filter
Interactively filter a `data.frame` and generate code to reproduce filters applied:
```r
# UI
filter_data_ui("filtering", max_height = "500px")
# Server
res_filter <- filter_data_server(
id = "filtering",
data = reactive(mtcars),
name = reactive("mtcars"),
vars = reactive(names(mtcars)),
widget_num = "slider",
widget_date = "slider",
label_na = "Missing"
)
```
You can select variables for which to create a filter and choose widgets used to create the UI filter.
The return value server-side is a list with the following items:
* **filtered**: a `reactive` function returning the data filtered.
* **code**: a `reactive` function returning the dplyr pipeline to filter data.
* **expr**: a `reactive` function returning an expression to filter data.
## Sample
Interactively sample a `data.frame` to keep only part of the data, depending on the number or proportion of rows to keep.
```r
# UI
sample_ui("myID")
# Server
result_sample <- sample_server("myID", reactive(iris))
```
## Edit
Interactively edit a `data.frame`, this module also allow to :
* **adding**, **deleting** and **modifying** rows
* choosing **editable columns** and choosing **mandatory columns**
* **exporting data** (csv and Excel)
```r
# UI
edit_data_ui(id = "id")
# Server
res_edited <- edit_data_server(
id = "id",
data_r = reactive(demo_edit),
add = TRUE,
update = TRUE,
delete = TRUE,
download_csv = TRUE,
download_excel = TRUE,
file_name_export = "datas",
var_edit = c("name", "job", "credit_card_provider", "credit_card_security_code"),
var_mandatory = c("name", "job")
)
```
This module returns the edited table with the user modifications.
See ?demo_edit to see the data created for this data edit example.