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.
install.packages("zuyaml")
Or the development version from GitHub:
# install.packages("pak")
pak::pak("pedrobtz/zuyaml")
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.
tests/testthat/ runs a curated 84-case yaml-test-suite subset in every R CMD check; ZUYAML_TEST_SUITE points it at a full 402-case checkout instead.tools/conformance.R walks the same corpus but reports rather than asserts — counts per boundary, failures named, against a baseline pinned in the script.278/279 that is meant to change deliberately rather than break a build.| 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.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.