XGeoRTR is explainable geometry backend infrastructure
for workflows that need portable analytic state. It standardizes
analytic outputs into xgeo_state objects with:
- geometry
- attributes
- indices
- selection
- level-of-detail summaries
- selected backend tables
- metadata
Packages such as shapViz3D, rTDA3D, and
renderer frontends consume this backend state downstream. XGeoRTR does
not include use-case presentation code or front-end adapters.
Create an xgeo_state
library(XGeoRTR)
demo_path <- system.file("extdata", "spatial_demo.csv", package = "XGeoRTR")
demo_tbl <- utils::read.csv(demo_path, stringsAsFactors = FALSE)
state <- as_xgeo_state(
demo_tbl,
x_col = "x",
y_col = "y",
z_col = "z",
value_col = "value",
feature_col = "feature",
method = "spatial-field-demo",
meta = list(source = "synthetic-demo", sample_id = "grid-01")
)
state
#> <xgeo_state>
#> structure: spatial
#> method: spatial-field-demo
#> points: 16
#> features: 16
#> embeddings: 1 (active: spatial)
#> diagnostics: 0
#> lod bundles: 0
summary(state)
#> <summary.xgeo_state>
#> structure: spatial
#> method: spatial-field-demo
#> points: 16
#> features: 16
#> explanations: 16
#> embeddings: 1 (active: spatial)
#> diagnostics: 0 (active: none)
#> lod bundles: 0 (active: none)
#> selected points:0
#> selected feats: 0Compute backend state operators
state <- compute_xgeo_embedding(state, method = "pca", source = "points", dims = 2)
state <- set_active_embedding(state, "pca_points")
state <- compute_xgeo_diagnostics(state, embedding = "pca_points", source = "points", k = 3)
state <- build_xgeo_lod(state, embedding = "pca_points", levels = c(8L, 16L), auto_threshold = 10L)
state <- set_xgeo_selection(state, point_ids = state$indices$point_ids[[1]])
summary(state)
#> <summary.xgeo_state>
#> structure: spatial
#> method: spatial-field-demo
#> points: 16
#> features: 16
#> explanations: 16
#> embeddings: 2 (active: pca_points)
#> diagnostics: 1 (active: diagnostics_pca_points_points)
#> lod bundles: 1 (active: density_grid_pca_points)
#> selected points:1
#> selected feats: 0Access backend-neutral fields
names(xgeo_geometry(state))
#> [1] "points"
names(xgeo_attributes(state))
#> [1] "explanations" "point_meta" "feature_meta" "predictions" "uncertainty"
#> [6] "embeddings" "diagnostics" "baseline" "method" "structure"
names(xgeo_indices(state))
#> [1] "point_ids" "feature_ids"
xgeo_selection(state)
#> $point_ids
#> [1] "point_1"
#>
#> $features
#> character(0)
names(xgeo_metadata(state))
#> [1] "source" "sample_id"Build selected backend tables
long_tbl <- xgeo_explanation_table(state)
point_tbl <- xgeo_point_values(state)
grid <- xgeo_regular_grid(point_tbl)
utils::head(long_tbl)
#> point_id feature value x y z label
#> 1 point_1 cell_1_1 0.65 1 1 0 cell_1_1
utils::head(point_tbl)
#> point_id x y z value
#> 1 point_1 1 1 0 0.65
names(grid)
#> [1] "x" "y" "z"Downstream use-case packages should consume these public tables rather than internal ingestion objects.
Downstream consumers
shapViz3D can consume explanation and point-value tables
for Shapley-oriented workflows. rTDA3D can consume point
and grid summaries for topology-oriented workflows. Renderer frontends
such as ggWebGL can consume xgeo_state through
their own adapter contracts. Those packages own presentation,
interaction, and front-end behavior.
Downstream use-case consumers
XGeoRTR stops at backend state and backend tables. It does not ship
use-case-specific presentation assets. SHAP semantics belong downstream
in a Shapley-oriented package, topology semantics belong downstream in a
topology-oriented package, and display orchestration belongs in renderer
frontends such as ggWebGL.
The backend-only example below shows the intended downstream-consumption pattern:
source("inst/examples/downstream_shapviz3d_state_tables.R")When the sibling shapViz3D repository is available, that
example reads the three deterministic evidence CSVs from
shapViz3D, builds xgeo_state objects, applies
selection, computes optional embedding/diagnostic/LOD state, and emits
only backend tables. When the downstream repo is unavailable, it falls
back to the bundled spatial_demo.csv so the example still
runs without renderer or SHAP-package dependencies.
Write and reload state
json_file <- tempfile(fileext = ".json")
write_xgeo_state(state, json_file)
restored <- read_xgeo_state(json_file)
restored$attributes$embeddings$active
#> [1] "pca_points"