Skip to contents

rho.bio is the typed, agent-independent substrate for declared bioinformatics resources. Manifests name resolvers and operations; resolution produces a receipt that keeps source observations and provenance separate from model-authored text.

Declare and resolve a resource

library(rho.async)
library(rho.bio)

resolver <- rho_resolver_spec(
  id = "memory.table",
  version = "1.0.0",
  title = "In-memory table",
  description = "Resolve the table declared in this example"
)
resource <- rho_virtual_resource(
  id = "genes",
  title = "Example genes",
  resolver = "memory.table"
)
manifest <- rho_manifest(
  id = "readme",
  version = "1.0.0",
  title = "README resources",
  description = "A small executable manifest",
  provides = list(
    resolvers = list(resolver),
    resources = list(resource)
  )
)

registry <- rho_bio_registry()
rho_register_manifest(registry, manifest)
rho_bind_resolver_impl(registry, "memory.table", function(resource, context) {
  list(
    result = rho_resource_handle(
      kind = "data.frame",
      value = data.frame(gene = c("TP53", "BRCA1"))
    ),
    provenance = list(method = "declared example")
  )
})

receipt <- rho_resolve_resource(registry, "genes") |>
  rho_await(timeout = 1000)
list(
  resource = receipt@resource_id,
  resolver = paste(receipt@resolver_id, receipt@resolver_version, sep = "@"),
  rows = nrow(receipt@result@value),
  digest = substr(receipt@params_digest, 1L, 19L)
)
#> $resource
#> [1] "genes"
#>
#> $resolver
#> [1] "memory.table@1.0.0"
#>
#> $rows
#> [1] 2
#>
#> $digest
#> [1] "sha256:4f53cda18c2b"

The registry fails closed when a resource, resolver declaration, or resolver implementation is absent. Database implementations are separate; the generic SQL contract is implemented for DuckDB by rho.duckdb.

See the rho.bio reference.