Skip to contents

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.



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, ...)


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) {
        "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")
            register_ledger(file, ..., date = date)
        "bean-report_hledger" = {
            file <- .bean_report(file, "hledger")
            register_hledger(file, ..., date = date)