MyNixOS website logo
Description

Transportation Infrastructure Data Toolbox.

An open-source toolbox for storing, validating, managing, and exploring transportation infrastructure data. Provides a relational data model for binders, aggregates, mixtures, and test results, with a human-readable file format (.pavdata) aligned with FAIR principles.

PavData

Version Lifecycle: experimental

pavdata is an R package for storing, validating, and exploring transportation infrastructure data with a lightweight, human-readable .pavdata format based on JSON.

It is designed for pavement and materials workflows where researchers need to:

  • create structured objects for samples, binders, aggregates, mixtures, and tests
  • validate required fields and plausible numeric ranges
  • serialize data to a portable file format
  • reload collections into an indexed in-memory library
  • inspect objects interactively with familiar R methods such as print(), summary(), and plot()

Installation

Install from a local source tree:

install.packages("path/to/pavdata", repos = NULL, type = "source")

After its first release on CRAN, install it with:

install.packages("pavdata")

Why pavdata?

Laboratory and field datasets in pavement engineering are often fragmented across spreadsheets, scripts, and reports. pavdata provides a small relational layer in R so those records can be created, checked, saved, and reused more consistently.

The package focuses on four practical ideas aligned with the FAIR Principles:

  • explicit object types for common pavement entities
  • built-in validation for required fields and plausible ranges
  • reproducible read/write support through .pavdata files
  • simple tools for browsing collections during analysis

Quick Start

Create a few linked objects:

library(pavdata)

binder <- pav_new(
  "binder",
  id = "binder-cap-50-70",
  name = "CAP 50/70",
  binder_type = "CAP 50/70",
  penetration_mm = 52,
  softening_point_c = 49
)

aggregate <- pav_new(
  "aggregate",
  id = "aggregate-basalt",
  name = "Basalt aggregate",
  bulk_specific_gravity = 2.71,
  water_absorption_pct = 1.2
)

mixture <- pav_new(
  "mixture",
  id = "mixture-dense-graded",
  name = "Dense graded mix",
  binder_id = binder$id,
  aggregate_id = aggregate$id,
  binder_content_pct = 5.3
)

volumetrics <- pav_new(
  "mixture_test",
  id = "test-volumetrics-dense-graded",
  name = "Dense graded mix volumetrics",
  mixture_id = mixture$id,
  test_type = "volumetrics",
  volumetrics = list(
    air_voids_pct = 4.1,
    voids_mineral_aggregate_pct = 15.4,
    voids_filled_asphalt_pct = 73.4,
    filler_binder_ratio = 1.1
  )
)

Validate the objects:

pav_check(binder)
pav_check(mixture)
pav_check(volumetrics)

Save them to disk and read them back:

path <- tempfile(fileext = ".pavdata")
pav_write(list(binder, aggregate, mixture, volumetrics), path)

objects <- pav_read(path)
names(objects)

Load them into a library for indexed access:

lib <- pav_library()
pav_library_load(lib, path)

print(lib)
pav_list(lib, type = "mixture")
pav_view(lib, mixture$id)

Inspecting Objects

PavData objects support standard S3 methods.

print()

Use print() for a compact object overview:

print(binder)
<pavdata_binder> CAP 50/70
  id: binder-cap-50-70 | v1 | 13 fields

summary()

Use summary() to display the populated metadata and data fields:

summary(volumetrics)
MIXTURE_TEST: Dense graded mix volumetrics
ID: test-volumetrics-dense-graded | v1 | Created: <timestamp>
Source:
mixture_id                     mixture-dense-graded
test_type                      volumetrics
volumetrics
  air_voids_pct                4.1
  voids_mineral_aggregate_pct  15.4
  voids_filled_asphalt_pct     73.4
  filler_binder_ratio          1.1

plot()

Use plot() to compare numeric fields. Short labels can be passed to the underlying base-R bar plot with names.arg:

plot(
  volumetrics,
  names.arg = c("Air voids (%)", "VMA (%)", "VFA (%)", "Filler/binder"),
  ylim = c(0, 80)
)

Main Functions

FunctionPurpose
pav_new()Create a new PavData object
pav_check()Validate one object
pav_check_integrity()Validate a collection and its foreign keys
pav_write()Write objects to a .pavdata file
pav_read()Read objects from a .pavdata file
pav_load()Read a file and validate all objects
pav_library()Create an in-memory indexed library
pav_library_load()Load a file into a library
pav_list()List objects in a library
pav_view()Display one object from a library

Object Types

pavdata currently supports these object families:

  • sample
  • binder
  • aggregate
  • mixture
  • binder_test
  • aggregate_test
  • mixture_test
  • reference

Each object shares common metadata such as id, name, type, version, created_at, source, and notes.

UML Data Model

The UML diagram below summarizes the S3 classes and their relationships.

Built-In Example Data

The package ships with an example .pavdata file:

path <- pavdata_sample_path()
path

You can use it to test import, browsing, and validation workflows.

Related Publications

  • Melo, C. D. R., Carvalho, P. H. J., Mariano, L. G., Babadopulos, L. F. A. L., Parente Junior, E., and Soares, J. B. (2025). Proposta preliminar de um repositório nacional aberto de ensaios de misturas asfálticas. In Anais do 39º Congresso de Pesquisa e Ensino em Transportes (39º ANPET) [electronic book]. Associação Nacional de Pesquisa e Ensino em Transportes. Goiânia, GO.

Authors and Affiliation

PavData is developed by:

Creator

Authors

Contributors

Affiliation

Metadata

Version

0.1.0

License

Unknown

Platforms (79)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    uefi
    wasip1
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-uefi
  • aarch64-windows
  • aarch64_be-none
  • arc-linux
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-linux
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • sh4-linux
  • vc4-none
  • wasm32-wasip1
  • wasm64-wasip1
  • x86_64-cygwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-uefi
  • x86_64-windows