README.md

zuyaml

Lifecycle: experimental R-CMD-check hardening native-checks pkgdown coverage

zuyaml converts between YAML 1.2 and ordinary R objects, using a bundled copy of the cyaml C11 parser and emitter, so there is no system dependency and no runtime dependency beyond R itself. Ambiguous YAML is handled strictly: the 1.2 core schema (so yes is a string), duplicate keys refused, large integers preserved, and a document stream kept apart from a sequence.

Installation

install.packages("zuyaml")

Or the development version from GitHub:

# install.packages("pak")
pak::pak("pedrobtz/zuyaml")

Usage

yaml_parse() turns YAML text into R objects:

library(zuyaml)

yaml_parse("host: localhost\nport: 8080\ntls: true\n")
#> $host
#> [1] "localhost"
#> 
#> $port
#> [1] 8080
#> 
#> $tls
#> [1] TRUE

yaml_emit() goes the other way. Note the quoting: "42" is a string in R, so it stays a string in YAML and on the way back. The same holds for the cases that are easy to get wrong — line breaks, leading and trailing whitespace, mapping keys, whole-numbered doubles — so what you emit parses back to what you had.

cat(yaml_emit(list(version = "42", ratio = 0.5)))
#> version: "42"
#> ratio: 0.5

Both have an _all variant for a YAML stream — several documents separated by ---, which is a different thing from a sequence — and yaml_read() / yaml_write() do the same for files:

yaml_parse_all("a: 1\n---\na: 2\n")
#> [[1]]
#> [[1]]$a
#> [1] 1
#> 
#> 
#> [[2]]
#> [[2]]$a
#> [1] 2

The getting started article documents the conversion rules in full, including the cases that do not round-trip.

Testing

| Workflow | Jobs, and what they do | When | Runs | |---|---|---|---| | R-CMD-check.yaml | R CMD check --as-cran on macOS, Windows and Ubuntu at R release and oldrel-1, and in the CRAN-like containers clang23, ubuntu-clang and ubuntu-gcc16 — the package vendors C11, so the compiler CRAN uses is the one that has to see it | push, PR | view | | hardening.yaml | full-test-suite — all 402 yaml-test-suite cases, then tools/conformance.R against its pinned baseline. fuzz — the wrapper fuzzer at 20,000 iterations | push, PR, weekly | view | | native-checks.yaml | sanitizers — UBSan on a runner, ASan in the clang-asan and gcc-asan images. valgrind, lto, rchk (failing on findings), and gctorture at step 500 on every push with the sensitive step-20 run weekly | push, PR, weekly | view | | coverage.yaml | covr, with a per-file breakdown in the job summary | push, PR | view |

R-CMD-check.yaml, native-checks.yaml and coverage.yaml call the reusable workflows in r-actions rather than keeping a second copy here. hardening.yaml does not: it holds the two checks that are specific to this package.



Try the zuyaml package in your browser

Any scripts or data that you put into this service are public.

zuyaml documentation built on Oct. 7, 2026, 5:08 p.m.