knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
The metadata
argument in pins is flexible and can hold any kind of metadata that you can formulate as a list()
. In some situations, you may want to read and write with consistent customized metadata; you can create functions to wrap pin_write()
and pin_read()
for your particular use case.
To see a different approach for when you want to write and read whole file(s) in a customized way, see vignette("managing-custom-formats")
.
We'll begin by creating a temporary board for demonstration:
library(pins) board <- board_temp()
Say you want to store a factor as JSON together with the levels of the factor in the metadata. We can write a function wrapping pin_write()
that creates the standardized metadata we are interested in and writes it in a consistent way.
pin_write_factor_json <- function(board, x, name, title = NULL, description = NULL, metadata = list(), versioned = NULL, tags = NULL, ...) { if (!is.factor(x)) rlang::abort("`x` is not a factor") factor_levels <- levels(x) metadata <- modifyList(metadata, list(factor_levels = factor_levels)) pin_write( board = board, x = x, name = name, type = "json", title = title, description = description, metadata = metadata, ... ) }
We can use this new function to write a pin as JSON with our specific metadata:
ten_letters <- factor(sample(letters, size = 10), levels = letters) board %>% pin_write_factor_json(ten_letters, "letters-as-json")
It's possible to read this pin using the regular pin_read()
function, but the object we get is no longer a factor!
board %>% pin_read("letters-as-json")
Instead, we can also write a special function for reading, to reconstruct the factor including its levels:
pin_read_factor_json <- function(board, name, version = NULL, hash = NULL, ...) { ret <- pin_read(board = board, name = name, version = version, hash = hash, ...) meta <- pin_meta(board = board, name = name, version = version, ...) factor(ret, levels = meta$user$factor_levels) } board %>% pin_read_factor_json("letters-as-json")
How are these approaches used in real projects?
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.