Getting little snippets of information from a table goes hand-in-hand with mixing those bits of info with your table info. Call info_snippet() to define a snippet and how you'll get that from the target table. The snippet definition is supplied either with a formula, or, with a pointblank-supplied snip_*() function. So long as you know how to interact with a table and extract information, you can easily define snippets for a informant object. And once those snippets are defined, you can insert them into the info text as defined through the other info_*() functions (info_tabular(), info_columns(), and info_section()). Use curly braces with just the snippet_name inside (e.g., "This column has {n_cat} categories.").

info_snippet(x, snippet_name, fn)



An informant object of class ptblank_informant.


The name for snippet, which is used for interpolating the result of the snippet formula into info text defined by an info_*() function.


A formula that obtains a snippet of data from the target table. It's best to use a leading dot (.) that stands for the table itself and use pipes to construct a series of operations to be performed on the table (e.g., ~ . %>% dplyr::pull(column_2) %>% max(na.rm = TRUE)). So long as the result is a length-1 vector, it'll likely be valid for insertion into some info text. Alternatively, a snip_*() function can be used here (these functions always return a formula that's suitable for all types of data sources).


A ptblank_informant object.

Snip functions provided in pointblank

For convenience, there are several snip_*() functions provided in the package that work on column data from the informant's target table. These are:

As it's understood what the target table is, only the column in each of these functions is necessary for obtaining the resultant text.


A pointblank informant can be written to YAML with yaml_write() and the resulting YAML can be used to regenerate an informant (with yaml_read_informant()) or perform the 'incorporate' action using the target table (via yaml_informant_incorporate()). Snippets are stored in the YAML representation and here is is how they are expressed in both R code and in the YAML output (showing both the meta_snippets and columns keys to demonstrate their relationship here).

# R statement
informant %>% 
    columns = "date_time",
    `Latest Date` = "The latest date is {latest_date}."
  ) %>%
    snippet_name = "latest_date",
    fn = ~ . %>% dplyr::pull(date) %>% max(na.rm = TRUE)
  ) %>%

# YAML representation
  latest_date: ~. %>% dplyr::pull(date) %>% max(na.rm = TRUE)
    _type: POSIXct, POSIXt
    Latest Date: The latest date is {latest_date}.
    _type: Date
    _type: integer


Function ID


See also

Other Information Functions: info_columns(), info_section(), info_tabular(), snip_highest(), snip_list(), snip_lowest(), snip_stats()


# Take the `small_table` and
# assign it to `test_table`; we'll
# modify it later
test_table <- small_table

# Generate an informant object, add
# two snippets with `info_snippet()`,
# add information with some other
# `info_*()` functions and then
# `incorporate()` the snippets into
# the info text
informant <- 
    read_fn = ~ test_table,
    tbl_name = "test_table",
    label = "An example."
  ) %>%
    snippet_name = "row_count",
    fn = ~ . %>% nrow()
  ) %>%
    snippet_name = "max_a",
    fn = snip_highest(column = "a")
  ) %>%
    columns = vars(a),
    info = "In the range of 1 to {max_a}. (SIMPLE)"
  ) %>%
    columns = starts_with("date"),
    info = "Time-based values (e.g., `Sys.time()`)."
  ) %>%
    columns = "date",
    info = "The date part of `date_time`. (CALC)"
  ) %>%
    section_name = "rows",
    row_count = "There are {row_count} rows available."
  ) %>%
#> Error in rlang::eval_tidy(., env = caller_env(n = 1)) object 'test_table' not found

# We can print the `informant` object
# to see the information report

# Let's modify `test_table` to give
# it more rows and an extra column
test_table <- 
  dplyr::bind_rows(test_table, test_table) %>%
  dplyr::mutate(h = a + c)

# Using `incorporate()` will cause
# the snippets to be reprocessed, and,
# the info text to be updated
informant <-
  informant %>% incorporate()
#> Error in incorporate(.) object 'informant' not found