rio implements format-specific S3 methods for each type of file that
can be imported from or exported to. This happens via internal S3
generics, .import and .export. It is possible
to write new methods like with any S3 generic (e.g.,
print).
As an example, .import.rio_csv imports from a
comma-separated values file. If you want to produce a method for a new
filetype with extension myfile, you simply have to create a
function called .import.rio_myfile that implements a
format-specific importing routine and returns a data.frame. rio will
automatically recognize new S3 methods, so that you can then import your
file using: import("file.myfile").
The way to develop export method is same:
.export.rio_csv. The first two parameters of
.export are file (file name) and
x (data frame to be exported).
As general guidance, if an import method creates many attributes,
these attributes should be stored — to the extent possible — in
variable-level attributes fields. These can be gathered to the
data.frame level by the user via gather_attrs.
Examples
arff
The following example shows how the arff import and export methods are implemented internally.
.import.rio_arff <- function(file, which = 1, ...) {
foreign::read.arff(file = file)
}
.export.rio_arff <- function(file, x, ...) {
foreign::write.arff(x = x, file = file, ...)
}ledger
This is the example from the ledger package (MIT) by Dr
Trevor L David .
.import.rio_ledger <- register # nolint
register <- function(file, ..., toolchain = default_toolchain(file), date = NULL) {
.assert_toolchain(toolchain)
switch(toolchain,
"ledger" = register_ledger(file, ..., date = date),
"hledger" = register_hledger(file, ..., date = date),
"beancount" = register_beancount(file, ..., date = date),
"bean-report_ledger" = {
file <- .bean_report(file, "ledger")
on.exit(unlink(file))
register_ledger(file, ..., date = date)
},
"bean-report_hledger" = {
file <- .bean_report(file, "hledger")
on.exit(unlink(file))
register_hledger(file, ..., date = date)
}
)
}