| Title: | Preflight Checks for 'R' Package System Requirements |
|---|---|
| Description: | Helps users on 'Linux' (and, where applicable, 'macOS') find the system packages they need before installing 'R' packages from source. Queries maintained system requirement sources, reports missing system packages, and generates installation commands, 'Dockerfile' snippets, 'GitHub Actions' steps, administrator request templates, and diagnostic reports from failed installation logs. |
| Authors: | Ahmad Sofi-Mahmudi [aut, cre] (ORCID: <https://orcid.org/0000-0001-6829-0823>) |
| Maintainer: | Ahmad Sofi-Mahmudi <[email protected]> |
| License: | GPL-3 |
| Version: | 0.1.0 |
| Built: | 2026-06-11 18:32:40 UTC |
| Source: | https://github.com/cran/sysreqr |
Produces a plain-text message that a user without root access can send to their system administrator. The message lists missing system packages, which R packages need them, and a suggested install command.
admin_request(x, platform = NULL, ...)admin_request(x, platform = NULL, ...)
x |
A |
platform |
Platform specification accepted by |
... |
Passed to |
A plain-text administrator request.
Other commands:
dockerfile(),
github_actions(),
install_command()
plan <- check_packages("xml2", platform = "ubuntu-22.04") cat(admin_request(plan))plan <- check_packages("xml2", platform = "ubuntu-22.04") cat(admin_request(plan))
Strips the sysreqr_plan class and attributes, returning a plain
data.frame. Equivalent to as.data.frame() on a plan, but provided as a
verb form for users who prefer that style.
as_data_frame(x)as_data_frame(x)
x |
A |
A data frame without the sysreqr_plan class.
Other plan:
is_sysreqr_plan(),
print.sysreqr_plan()
plan <- check_packages("xml2", platform = "ubuntu-22.04") df <- as_data_frame(plan) inherits(df, "sysreqr_plan") inherits(df, "data.frame")plan <- check_packages("xml2", platform = "ubuntu-22.04") df <- as_data_frame(plan) inherits(df, "sysreqr_plan") inherits(df, "data.frame")
Converts a plan into a structured list suitable for downstream tooling
(other R code, deployment scripts, or CI). The fields are platform,
backend, pre_install, install, post_install, and packages.
as_install_plan(x)as_install_plan(x)
x |
A |
A list with commands and plan data.
Other output:
write_dockerfile_snippet(),
write_install_script(),
write_json(),
write_report()
plan <- check_packages("xml2", platform = "ubuntu-22.04") as_install_plan(plan)plan <- check_packages("xml2", platform = "ubuntu-22.04") as_install_plan(plan)
Convenience wrapper around diagnose_log(). When text is NULL (the
default), the most recent R error message is read from
base::geterrmessage().
check_error( text = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE )check_error( text = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE )
text |
Error text. When |
platform |
Platform specification accepted by |
backend |
One of |
repo |
Repository name used by the PPM backend. |
check_installed |
Whether to check installed system packages on the current host when possible. |
A sysreqr_plan.
Other diagnose:
diagnose_failed_packages(),
diagnose_log()
check_error( text = "ERROR: configuration failed for package 'xml2'", platform = "ubuntu-22.04", backend = "bundled" )check_error( text = "ERROR: configuration failed for package 'xml2'", platform = "ubuntu-22.04", backend = "bundled" )
Reads the package names from one or more R library paths and resolves their system requirements. Useful for auditing an existing R installation.
check_library( packages = NULL, library = .libPaths()[1], platform = NULL, backend = c("bundled", "auto", "ppm", "pak") )check_library( packages = NULL, library = .libPaths()[1], platform = NULL, backend = c("bundled", "auto", "ppm", "pak") )
packages |
Optional installed R package names. |
library |
Library path or paths. |
platform |
Platform specification accepted by |
backend |
One of |
A sysreqr_plan.
Other preflight:
check_packages(),
check_project(),
detect_project_packages()
# Offline, with an explicit package list and the bundled backend: check_library( packages = c("xml2", "curl"), platform = "ubuntu-22.04", backend = "bundled" )# Offline, with an explicit package list and the bundled backend: check_library( packages = c("xml2", "curl"), platform = "ubuntu-22.04", backend = "bundled" )
Resolves the system packages an R package needs on a given Linux platform
and returns them in a structured plan. The "auto" backend prefers the
offline bundled database on apt platforms, then Posit Package Manager,
then pak.
check_packages( packages, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", dependencies = NA, upgrade = TRUE, check_installed = TRUE )check_packages( packages, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", dependencies = NA, upgrade = TRUE, check_installed = TRUE )
packages |
Package names or package references. |
platform |
Platform specification accepted by |
backend |
One of |
repo |
Repository name used in notes and by the PPM backend. |
dependencies |
Dependency policy passed to |
upgrade |
Upgrade policy passed to |
check_installed |
Whether to check installed system packages on the current host when possible. |
A sysreqr_plan.
check_project(), check_library(), diagnose_log().
Other preflight:
check_library(),
check_project(),
detect_project_packages()
plan <- check_packages(c("xml2", "curl"), platform = "ubuntu-22.04") plan install_command(plan)plan <- check_packages(c("xml2", "curl"), platform = "ubuntu-22.04") plan install_command(plan)
Reports whether a platform is currently served by Posit Package Manager and whether it has system requirement metadata and binary packages.
check_ppm(platform = NULL, base_url = ppm_default_base_url())check_ppm(platform = NULL, base_url = ppm_default_base_url())
platform |
Platform specification accepted by |
base_url |
Posit Package Manager base URL. |
A list with the matched platform and Package Manager status.
Other ppm:
ppm_platforms(),
ppm_repo(),
ppm_sysreqs(),
use_ppm()
check_ppm("ubuntu-22.04") check_ppm("fedora-40")check_ppm("ubuntu-22.04") check_ppm("fedora-40")
Convenience wrapper around detect_project_packages() and
check_packages().
check_project( path = ".", include_suggests = FALSE, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), ... )check_project( path = ".", include_suggests = FALSE, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), ... )
path |
Project path. |
include_suggests |
Whether to include |
platform |
Platform specification accepted by |
backend |
One of |
... |
Passed to |
A sysreqr_plan.
Other preflight:
check_library(),
check_packages(),
detect_project_packages()
project <- file.path(tempdir(), "demo-project") dir.create(project, showWarnings = FALSE) writeLines( c("Package: demo", "Imports: xml2"), file.path(project, "DESCRIPTION") ) check_project(project, platform = "ubuntu-22.04", backend = "bundled")project <- file.path(tempdir(), "demo-project") dir.create(project, showWarnings = FALSE) writeLines( c("Package: demo", "Imports: xml2"), file.path(project, "DESCRIPTION") ) check_project(project, platform = "ubuntu-22.04", backend = "bundled")
Returns the name of the operating system package manager for a platform:
"apt", "dnf", "yum", "zypper", "apk", or "brew".
detect_package_manager(platform = NULL)detect_package_manager(platform = NULL)
platform |
A platform specification accepted by |
A package manager name such as "apt" or "dnf".
Other platform:
detect_platform(),
resolve_platform()
detect_package_manager("ubuntu-22.04") detect_package_manager("fedora-40") detect_package_manager("opensuse156")detect_package_manager("ubuntu-22.04") detect_package_manager("fedora-40") detect_package_manager("opensuse156")
Detects the host operating system and, on Linux, parses /etc/os-release.
On macOS, queries sw_vers. Returns a structured platform object used by
the rest of the package. When os_release is supplied and exists, the file
is parsed even on macOS or Windows; this makes fixture-driven testing
practical.
detect_platform(os_release = "/etc/os-release")detect_platform(os_release = "/etc/os-release")
os_release |
Path to an |
An object of class sysreqr_platform (a list).
Other platform:
detect_package_manager(),
resolve_platform()
platform <- detect_platform() platform$distro # Reproducible reads from a fixture file: fixture <- system.file( "extdata", "os-release-fedora-40", package = "sysreqr", mustWork = FALSE ) if (nzchar(fixture)) detect_platform(os_release = fixture)platform <- detect_platform() platform$distro # Reproducible reads from a fixture file: fixture <- system.file( "extdata", "os-release-fedora-40", package = "sysreqr", mustWork = FALSE ) if (nzchar(fixture)) detect_platform(os_release = fixture)
Inspects a project directory for the R packages it uses. The detection priority is:
detect_project_packages(path = ".", include_suggests = FALSE)detect_project_packages(path = ".", include_suggests = FALSE)
path |
Project path. |
include_suggests |
Whether to include |
renv.lock (the Packages map),
DESCRIPTION (Depends, Imports, LinkingTo, and optionally
Suggests),
.R, .Rmd, .qmd, and NAMESPACE files (looking for library(),
require(), requireNamespace(), and pkg::fun references; line
comments are ignored).
A character vector of package names.
Other preflight:
check_library(),
check_packages(),
check_project()
project <- file.path(tempdir(), "demo-project") dir.create(project, showWarnings = FALSE) writeLines( c("Package: demo", "Imports: xml2, curl"), file.path(project, "DESCRIPTION") ) detect_project_packages(project)project <- file.path(tempdir(), "demo-project") dir.create(project, showWarnings = FALSE) writeLines( c("Package: demo", "Imports: xml2, curl"), file.path(project, "DESCRIPTION") ) detect_project_packages(project)
Resolves the system requirements for a set of R packages that the user already knows failed to install. Useful when an install was attempted outside R, or when the log was lost.
diagnose_failed_packages( packages, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE )diagnose_failed_packages( packages, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE )
packages |
R package names inferred from failed installation output. |
platform |
Platform specification accepted by |
backend |
One of |
repo |
Repository name used by the PPM backend. |
check_installed |
Whether to check installed system packages on the current host when possible. |
A sysreqr_plan.
Other diagnose:
check_error(),
diagnose_log()
diagnose_failed_packages( c("xml2", "curl"), platform = "ubuntu-22.04", backend = "bundled" )diagnose_failed_packages( c("xml2", "curl"), platform = "ubuntu-22.04", backend = "bundled" )
Scans an installation log for common compiler and linker errors and for R-level "configuration failed" and "non-zero exit status" patterns, then resolves those failed packages back to their system requirements.
diagnose_log( path = NULL, text = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE ) diagnose_install_log( path = NULL, text = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE )diagnose_log( path = NULL, text = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE ) diagnose_install_log( path = NULL, text = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE )
path |
Path to an installation log. |
text |
Log text. Used when |
platform |
Platform specification accepted by |
backend |
One of |
repo |
Repository name used by the PPM backend. |
check_installed |
Whether to check installed system packages on the current host when possible. |
The function combines two paths:
Direct log-pattern matching against a curated list of header and linker error messages.
Failed package extraction plus a back-end lookup of those package names.
Confidence levels are "high" for direct pattern matches and pak/PPM
lookups, and "medium" for bundled fallback data and inferred package
requirements.
A sysreqr_plan with likely system package fixes.
Other diagnose:
check_error(),
diagnose_failed_packages()
log <- paste( "fatal error: libxml/parser.h: No such file or directory", "ERROR: configuration failed for package 'xml2'", sep = "\n" ) plan <- diagnose_log(text = log, platform = "ubuntu-22.04") planlog <- paste( "fatal error: libxml/parser.h: No such file or directory", "ERROR: configuration failed for package 'xml2'", sep = "\n" ) plan <- diagnose_log(text = log, platform = "ubuntu-22.04") plan
Produces a Dockerfile RUN snippet that installs the system packages a
plan needs. On apt platforms the output uses the standard
apt-get update && apt-get install -y --no-install-recommends ... && rm -rf /var/lib/apt/lists/* pattern.
dockerfile(x, platform = NULL, missing_only = TRUE, ...)dockerfile(x, platform = NULL, missing_only = TRUE, ...)
x |
A |
platform |
Platform specification accepted by |
missing_only |
Whether to include only packages not known to be installed. |
... |
Passed to |
A single Dockerfile snippet.
Other commands:
admin_request(),
github_actions(),
install_command()
plan <- check_packages("xml2", platform = "ubuntu-22.04") cat(dockerfile(plan))plan <- check_packages("xml2", platform = "ubuntu-22.04") cat(dockerfile(plan))
Prints a short, friendly explanation for each system package an R package needs and the command to install it. Useful for teaching and for emails to less-experienced collaborators.
explain(x, platform = NULL, ...)explain(x, platform = NULL, ...)
x |
A package name, package vector, or |
platform |
Platform specification accepted by |
... |
Passed to |
A character vector of explanation lines, invisibly.
Other setup:
print.sysreqr_setup_advice(),
setup_advice()
plan <- check_packages("xml2", platform = "ubuntu-22.04") explain(plan)plan <- check_packages("xml2", platform = "ubuntu-22.04") explain(plan)
Produces a GitHub Actions YAML step that installs the system packages a
plan needs. gha() is a short alias.
github_actions(x, platform = NULL, missing_only = TRUE, ...) gha(x, platform = NULL, missing_only = TRUE, ...)github_actions(x, platform = NULL, missing_only = TRUE, ...) gha(x, platform = NULL, missing_only = TRUE, ...)
x |
A |
platform |
Platform specification accepted by |
missing_only |
Whether to include only packages not known to be installed. |
... |
Passed to |
A YAML snippet.
Other commands:
admin_request(),
dockerfile(),
install_command()
plan <- check_packages("xml2", platform = "ubuntu-22.04") cat(github_actions(plan)) identical(gha(plan), github_actions(plan))plan <- check_packages("xml2", platform = "ubuntu-22.04") cat(github_actions(plan)) identical(gha(plan), github_actions(plan))
Translates a plan (or a package vector that can be resolved to a plan) into shell commands appropriate for the platform's package manager.
install_command( x, platform = NULL, sudo = TRUE, update = TRUE, missing_only = TRUE, ... )install_command( x, platform = NULL, sudo = TRUE, update = TRUE, missing_only = TRUE, ... )
x |
A |
platform |
Platform specification accepted by |
sudo |
Whether to prefix commands with |
update |
Whether to include the package manager update command when appropriate. |
missing_only |
Whether to include only packages not known to be installed. |
... |
Passed to |
A character vector of shell commands.
Other commands:
admin_request(),
dockerfile(),
github_actions()
plan <- check_packages(c("xml2", "curl"), platform = "ubuntu-22.04") install_command(plan) install_command(plan, sudo = FALSE, update = FALSE)plan <- check_packages(c("xml2", "curl"), platform = "ubuntu-22.04") install_command(plan) install_command(plan, sudo = FALSE, update = FALSE)
Test whether an object is a sysreqr plan
is_sysreqr_plan(x)is_sysreqr_plan(x)
x |
An object. |
TRUE if x inherits from "sysreqr_plan".
Other plan:
as_data_frame(),
print.sysreqr_plan()
plan <- check_packages("xml2", platform = "ubuntu-22.04") is_sysreqr_plan(plan) is_sysreqr_plan(data.frame(x = 1))plan <- check_packages("xml2", platform = "ubuntu-22.04") is_sysreqr_plan(plan) is_sysreqr_plan(data.frame(x = 1))
Queries the Posit Package Manager /__api__/status endpoint and returns a
data frame of supported distributions.
ppm_platforms(base_url = ppm_default_base_url())ppm_platforms(base_url = ppm_default_base_url())
base_url |
Posit Package Manager base URL. |
A data frame of platform records reported by Package Manager.
Other ppm:
check_ppm(),
ppm_repo(),
ppm_sysreqs(),
use_ppm()
ppm_platforms()ppm_platforms()
Constructs a Linux binary repository URL for the given platform, CRAN repository alias, and snapshot.
ppm_repo( platform = NULL, repo = "cran", snapshot = "latest", base_url = ppm_default_base_url() )ppm_repo( platform = NULL, repo = "cran", snapshot = "latest", base_url = ppm_default_base_url() )
platform |
Platform specification accepted by |
repo |
Repository name. |
snapshot |
Snapshot name or date. |
base_url |
Posit Package Manager base URL. |
A repository URL.
Other ppm:
check_ppm(),
ppm_platforms(),
ppm_sysreqs(),
use_ppm()
ppm_repo(platform = "ubuntu-22.04") ppm_repo(platform = "ubuntu-26.04", snapshot = "2026-04-01")ppm_repo(platform = "ubuntu-22.04") ppm_repo(platform = "ubuntu-26.04", snapshot = "2026-04-01")
Queries the Posit Package Manager /sysreqs endpoint for the given
packages and platform, and normalizes the response into a
sysreqr_plan. If the API call fails, the function falls back to the
bundled database and records the failure in the
"fallback_error" attribute of the returned plan.
ppm_sysreqs( packages = NULL, all = FALSE, platform = NULL, repo = "cran", base_url = ppm_default_base_url(), check_installed = TRUE )ppm_sysreqs( packages = NULL, all = FALSE, platform = NULL, repo = "cran", base_url = ppm_default_base_url(), check_installed = TRUE )
packages |
Package names. Required when |
all |
Whether to return system requirements for the whole repository. |
platform |
Platform specification accepted by |
repo |
Repository name. |
base_url |
Posit Package Manager base URL. |
check_installed |
Whether to check installed system packages on the current host when possible. |
A sysreqr_plan.
Other ppm:
check_ppm(),
ppm_platforms(),
ppm_repo(),
use_ppm()
ppm_sysreqs(c("xml2", "curl"), platform = "ubuntu-22.04")ppm_sysreqs(c("xml2", "curl"), platform = "ubuntu-22.04")
Print a sysreqr plan
## S3 method for class 'sysreqr_plan' print(x, ...)## S3 method for class 'sysreqr_plan' print(x, ...)
x |
A |
... |
Unused. |
x, invisibly.
Other plan:
as_data_frame(),
is_sysreqr_plan()
Print setup advice
## S3 method for class 'sysreqr_setup_advice' print(x, ...)## S3 method for class 'sysreqr_setup_advice' print(x, ...)
x |
A |
... |
Unused. |
x, invisibly.
Other setup:
explain(),
setup_advice()
Accepts a NULL, a sysreqr_platform object, or a short string and
returns a fully normalized platform object. Strings can be the
<distro>-<version> shorthand ("ubuntu-22.04", "debian-12") or a
codename alias ("jammy", "noble", "resolute", "bookworm",
"trixie").
resolve_platform(platform = NULL)resolve_platform(platform = NULL)
platform |
|
A platform list with class "sysreqr_platform".
Other platform:
detect_package_manager(),
detect_platform()
resolve_platform("ubuntu-22.04") resolve_platform("resolute") resolve_platform("bookworm")resolve_platform("ubuntu-22.04") resolve_platform("resolute") resolve_platform("bookworm")
Produces a practical checklist for users who are new to R on GNU/Linux. It
recommends binary package repositories where available, explains when R
Project operating system repositories are relevant, lists source build
tools, and can add package-specific system requirements. It never runs
sudo, edits the system R configuration, or changes operating system
repositories; the user remains in control.
setup_advice( packages = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE, include_r_project_repo = TRUE, script = NULL )setup_advice( packages = NULL, platform = NULL, backend = c("auto", "bundled", "ppm", "pak"), repo = "cran", check_installed = TRUE, include_r_project_repo = TRUE, script = NULL )
packages |
Optional R package names to check. |
platform |
Platform specification accepted by |
backend |
One of |
repo |
Repository name used for Posit Package Manager and sysreq lookup. |
check_installed |
Whether to check installed system packages on the current host when possible. |
include_r_project_repo |
Whether to include optional R Project operating system repository commands for supported Linux distributions. |
script |
Optional path. When supplied, an executable shell script is written with the safe setup commands. |
A sysreqr_setup_advice object.
Other setup:
explain(),
print.sysreqr_setup_advice()
advice <- setup_advice( "xml2", platform = "ubuntu-22.04", backend = "bundled" ) print(advice) # Write a reviewable shell script: setup_advice( c("xml2", "curl"), platform = "ubuntu-22.04", backend = "bundled", script = tempfile(fileext = ".sh") )advice <- setup_advice( "xml2", platform = "ubuntu-22.04", backend = "bundled" ) print(advice) # Write a reviewable shell script: setup_advice( c("xml2", "curl"), platform = "ubuntu-22.04", backend = "bundled", script = tempfile(fileext = ".sh") )
Emits or installs the R code lines that point options(repos) at a Posit
Package Manager binary repository. With dry_run = TRUE (the default),
the lines are returned without touching any file, so the user can review
them before applying. When dry_run = FALSE, path must be supplied
explicitly.
use_ppm( scope = c("user", "project"), platform = NULL, repo = "cran", dry_run = TRUE, path = NULL )use_ppm( scope = c("user", "project"), platform = NULL, repo = "cran", dry_run = TRUE, path = NULL )
scope |
|
platform |
Platform specification accepted by |
repo |
Repository name. |
dry_run |
If |
path |
Explicit |
The configuration lines, invisibly when written.
Other ppm:
check_ppm(),
ppm_platforms(),
ppm_repo(),
ppm_sysreqs()
use_ppm("user", platform = "ubuntu-22.04", dry_run = TRUE) # Write to a throwaway .Rprofile under tempdir(): use_ppm( "user", platform = "ubuntu-22.04", dry_run = FALSE, path = file.path(tempdir(), ".Rprofile") )use_ppm("user", platform = "ubuntu-22.04", dry_run = TRUE) # Write to a throwaway .Rprofile under tempdir(): use_ppm( "user", platform = "ubuntu-22.04", dry_run = FALSE, path = file.path(tempdir(), ".Rprofile") )
Writes the output of dockerfile() to a file so it can be appended to an
existing Dockerfile or included verbatim.
write_dockerfile_snippet(plan, path)write_dockerfile_snippet(plan, path)
plan |
A |
path |
Output path. |
path, invisibly.
Other output:
as_install_plan(),
write_install_script(),
write_json(),
write_report()
plan <- check_packages("xml2", platform = "ubuntu-22.04") write_dockerfile_snippet(plan, file.path(tempdir(), "Dockerfile.sysreqs"))plan <- check_packages("xml2", platform = "ubuntu-22.04") write_dockerfile_snippet(plan, file.path(tempdir(), "Dockerfile.sysreqs"))
Writes a POSIX-shell install script. The script begins with
#!/usr/bin/env sh and set -eu and is marked executable.
write_install_script(plan, path)write_install_script(plan, path)
plan |
A |
path |
Output path. |
path, invisibly.
Other output:
as_install_plan(),
write_dockerfile_snippet(),
write_json(),
write_report()
plan <- check_packages("xml2", platform = "ubuntu-22.04") write_install_script(plan, file.path(tempdir(), "install-sysreqs.sh"))plan <- check_packages("xml2", platform = "ubuntu-22.04") write_install_script(plan, file.path(tempdir(), "install-sysreqs.sh"))
Serializes the plan data frame to JSON.
write_json(plan, path)write_json(plan, path)
plan |
A |
path |
Output path. |
path, invisibly.
Other output:
as_install_plan(),
write_dockerfile_snippet(),
write_install_script(),
write_report()
plan <- check_packages("xml2", platform = "ubuntu-22.04") write_json(plan, file.path(tempdir(), "sysreqs.json"))plan <- check_packages("xml2", platform = "ubuntu-22.04") write_json(plan, file.path(tempdir(), "sysreqs.json"))
Produces a human-readable Markdown report describing the platform, selected backend, R packages checked, system packages needed, and a suggested install command.
write_report(plan, path)write_report(plan, path)
plan |
A |
path |
Output path. |
path, invisibly.
Other output:
as_install_plan(),
write_dockerfile_snippet(),
write_install_script(),
write_json()
plan <- check_packages("xml2", platform = "ubuntu-22.04") write_report(plan, file.path(tempdir(), "SYSREQS.md"))plan <- check_packages("xml2", platform = "ubuntu-22.04") write_report(plan, file.path(tempdir(), "SYSREQS.md"))