| Title: | Componentes de Interfaz ANSGIS (Calcite) desde R |
|---|---|
| Description: | Genera la interfaz de una aplicacion geoespacial con el look del Calcite Design System de Esri desde R puro, emitiendo custom elements (<calcite-shell>, <calcite-panel>, <calcite-action-bar>, ...) con htmltools. No incluye ni modifica codigo de Esri: solo emite los nombres de los custom elements y declara la dependencia de assets, que puede resolverse contra un servidor propio (soberano) o contra un CDN. Corre en R nativo y en webR (WebAssembly), por lo que el documento puede generarse enteramente en el navegador, sin servidor. Desde 0.2.0 incluye los ELEMENTOS de un tablero especificados por la documentacion de ArcGIS Dashboards (indicador, medidor, graficos, tabla, lista, detalles, mapa y selectores), el motor de consulta que los alimenta (contrato where + groupByFields + statisticDefinitions, resuelto por R en el navegador) y ansgis_fusionar_tablero(), que autorea el tablero como un documento de R Markdown con la sintaxis de flexdashboard pero fusionado con knitr, porque rmarkdown::render() exige pandoc y pandoc no corre en wasm. |
| Authors: | Emir Rivas [aut, cre] |
| Maintainer: | Emir Rivas <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.2.1 |
| Built: | 2026-08-17 21:09:17 UTC |
| Source: | https://github.com/emri-setup/ansgisui |
Construye el dataset (query a la Esri) desde los atributos del encabezado
.dataset_de(e, capa).dataset_de(e, capa)
'data-actions="filter,zoom,pan,flash,popup"' y 'data-filter-field="barrio"'. El destino de 'filter' es, por defecto, TODOS los demas elementos con dataset —que es el alcance por defecto que fija el pliego— salvo los de 'data-except'.
.eventos_de(e, id, todos_ids, mapa_id).eventos_de(e, id, todos_ids, mapa_id)
Emite el HTML del elemento segun su clase
.render_elemento(e, id, piezas).render_elemento(e, id, piezas)
Una accion con icono (calcite-action)
ansgis_action(texto, icono, activa = FALSE, mostrar_texto = TRUE, id = NULL)ansgis_action(texto, icono, activa = FALSE, mostrar_texto = TRUE, id = NULL)
texto |
etiqueta. |
icono |
nombre de icono Calcite (ej. "layers", "legend", "search"). |
activa |
marca la accion como activa. |
mostrar_texto |
muestra la etiqueta junto al icono. |
id |
id del elemento (para engancharle JS). |
Barra de acciones lateral (calcite-action-bar)
ansgis_action_bar(..., posicion = "action-bar", expandible = TRUE)ansgis_action_bar(..., posicion = "action-bar", expandible = TRUE)
... |
acciones ('ansgis_action()') o grupos. |
posicion |
"start" o "end" (slot dentro del shell-panel). |
expandible |
si FALSE, oculta el boton de expandir. |
Bloque colapsable dentro de un panel (calcite-block)
ansgis_block( ..., titulo = NULL, descripcion = NULL, icono = NULL, abierto = TRUE )ansgis_block( ..., titulo = NULL, descripcion = NULL, icono = NULL, abierto = TRUE )
... |
contenido. |
titulo, descripcion
|
textos. |
icono |
icono Calcite. |
abierto |
si TRUE arranca expandido. |
NIVEL 3 — ata un control a un calculo hecho en R, en vivo
ansgis_calculo_vivo( control_id, salida_id, codigo, evento = "calciteSliderChange", mapa_id = NULL )ansgis_calculo_vivo( control_id, salida_id, codigo, evento = "calciteSliderChange", mapa_id = NULL )
control_id |
id del '<calcite-slider>' (u otro control con 'value'). |
salida_id |
id del elemento donde se escribe el resultado. |
codigo |
plantilla de codigo R; 'v' se reemplaza por el valor del control. Debe devolver un valor imprimible o un vector de indices. |
evento |
evento del control a escuchar. |
mapa_id |
si se pasa, los indices devueltos por R resaltan esos puntos. |
Tarjeta (calcite-card)
ansgis_card( ..., titulo = NULL, subtitulo = NULL, pie = NULL, seleccionable = FALSE )ansgis_card( ..., titulo = NULL, subtitulo = NULL, pie = NULL, seleccionable = FALSE )
... |
contenido. |
titulo, subtitulo
|
textos (van en los slots heading/description). |
pie |
contenido del pie de la tarjeta. |
seleccionable |
agrega el control de seleccion. |
Generaliza 'ansgis_calculo_vivo()' para el caso "el analisis devuelve un valor por poligono". El codigo de R se declara una sola vez; 'id' se reemplaza por el valor del control con ese id. R tiene que devolver un vector numerico cuyo PRIMER elemento es el resumen de toda la ciudad y los siguientes, un valor por poligono (en el mismo orden que la tabla y que los 'data-i' del SVG).
ansgis_coropleta_viva( controles, codigo, mapa_id, tabla_id = NULL, columna = 2, cortes = c(20, 40, 60, 80), colores = c("#c7361f", "#e8763a", "#f2c14e", "#95c65c", "#2e8b57"), etiquetas = character(), salida_id = NULL, reloj_id = NULL, aviso_id = NULL, plantilla = "{ciudad}% de la Ciudad" )ansgis_coropleta_viva( controles, codigo, mapa_id, tabla_id = NULL, columna = 2, cortes = c(20, 40, 60, 80), colores = c("#c7361f", "#e8763a", "#f2c14e", "#95c65c", "#2e8b57"), etiquetas = character(), salida_id = NULL, reloj_id = NULL, aviso_id = NULL, plantilla = "{ciudad}% de la Ciudad" )
controles |
ids de los controles Calcite que disparan el recalculo. |
codigo |
plantilla de codigo R. |
mapa_id |
id del contenedor del SVG (los poligonos llevan 'data-i'). |
tabla_id |
id del '<calcite-table>' (o NULL). |
columna |
indice 0-based de la celda de la tabla que se actualiza. |
cortes, colores
|
escala de color (length(colores) == length(cortes)+1). |
etiquetas |
nombres de los poligonos, para el titular. |
salida_id, reloj_id, aviso_id
|
elementos de titular, de tiempo y del aviso "el motor esta cargando" (este ultimo se oculta cuando R esta listo). |
plantilla |
texto del titular; 'ciudad', 'peor', 'peorv' y los ids de los controles se reemplazan. |
Embebe un data.frame en la pagina como CSV (para que lo lea el R del navegador)
ansgis_datos_embebidos(df, id = "ansgis-datos")ansgis_datos_embebidos(df, id = "ansgis-datos")
df |
data.frame. |
id |
id del elemento contenedor. |
Dependencia de assets del design system
ansgis_dep( source = c("local", "cdn", "ans"), version = CALCITE_VERSION, base_url = "/assets/calcite" )ansgis_dep( source = c("local", "cdn", "ans"), version = CALCITE_VERSION, base_url = "/assets/calcite" )
source |
"local" (auto-hosteado por el Worker, soberano), "cdn" (jsDelivr) o "ans" (tema propio, sin Esri). |
version |
version de calcite-components. |
base_url |
prefijo de URL cuando source = "local". |
Escucha los eventos de seleccion del '<calcite-table>' (y, como respaldo, el clic sobre la fila) y resalta en el SVG los puntos cuyo 'data-grupo' coincide con la primera celda de la fila.
ansgis_enlace_tabla_mapa( tabla_id, mapa_id, etiqueta_id = NULL, selector = "circle[data-grupo]", clave = "grupo", css = NULL, todos = "todas las comunas" )ansgis_enlace_tabla_mapa( tabla_id, mapa_id, etiqueta_id = NULL, selector = "circle[data-grupo]", clave = "grupo", css = NULL, todos = "todas las comunas" )
tabla_id |
id del '<calcite-table>'. |
mapa_id |
id del contenedor del mapa. |
etiqueta_id |
id opcional de un elemento donde escribir el estado. |
selector |
selector CSS de las geometrias del mapa que se resaltan. Por defecto los puntos ('circle[data-grupo]'); para una coropleta de poligonos se pasa '"path[data-barrio]"'. |
clave |
nombre del 'data-*' que se compara con la primera celda. |
css |
CSS propio para las clases 'apagado'/'resaltado' (si es NULL usa el de los puntos). |
todos |
texto que se escribe en la etiqueta cuando no hay seleccion. |
Reemplaza a 'rmarkdown::render(output = flexdashboard::flex_dashboard)', que en webR no corre porque exige pandoc. Acá el motor es 'knitr' (que sí corre) más este traductor.
ansgis_fusionar_tablero( rmd, capa = "datos", envir = parent.frame(), mapa_id = "mapa" )ansgis_fusionar_tablero( rmd, capa = "datos", envir = parent.frame(), mapa_id = "mapa" )
rmd |
ruta del documento. |
capa |
nombre de la capa por defecto de los datasets. |
envir |
ambiente donde se evalúan los chunks. |
mapa_id |
id del elemento de mapa (destino de las acciones geométricas). |
extra |
lista de nodos que se agregan al final del body (datos embebidos, motor de R, documento del dashboard). |
lista con '$doc' (el documento del dashboard, formato Esri), '$cuerpo' (el HTML del body) y '$css' (el grid del layout).
Devuelve el contenedor donde se monta el motor de mapa (MapLibre, deck.gl o '<arcgis-map>'). Se deja como div propio para no atarse a un motor: el JS que se pase en 'montar' recibe el id.
ansgis_map(..., id = "ansgis-mapa", leyenda = "lienzo del mapa", montar = NULL)ansgis_map(..., id = "ansgis-mapa", leyenda = "lienzo del mapa", montar = NULL)
id |
id del contenedor. |
leyenda |
texto de marca de agua mientras no hay motor montado. |
montar |
codigo JS opcional que monta el motor sobre ese id. |
Deja 'window.ansgisR.correr(codigo)' disponible y dispara el evento 'ansgis:r-listo' cuando termina de arrancar. Los datos embebidos con 'ansgis_datos_embebidos()' quedan cargados en el objeto 'farm'.
ansgis_motor_r( base_url = "/webr/", datos_id = "ansgis-datos", datos = NULL, preludio = NULL, paquetes = character(), estado_id = NULL )ansgis_motor_r( base_url = "/webr/", datos_id = "ansgis-datos", datos = NULL, preludio = NULL, paquetes = character(), estado_id = NULL )
base_url |
de donde se sirve webR (auto-hosteado por el Worker). |
datos_id |
id del bloque de datos embebidos (o NULL). Se lee en 'farm'. |
datos |
vector de caracteres CON NOMBRE: 'c(nombre_en_R = "id-del-bloque")'. Permite cargar varias tablas. Si se pasa, ignora 'datos_id'. |
preludio |
codigo R que corre una vez, despues de cargar los datos (tipicamente define la funcion de analisis). |
paquetes |
paquetes de CRAN-wasm a instalar al arrancar. |
estado_id |
id de un elemento donde escribir el estado de arranque. |
Resuelve las dependencias declaradas (htmltools::renderTags) e inyecta el '<head>'. No usa pandoc: es R puro, por lo que corre igual en R nativo y en webR (el navegador).
ansgis_page( ..., titulo = "ANSGIS", source = c("local", "cdn", "ans"), lang = "es", modo = "light", favicon = NULL )ansgis_page( ..., titulo = "ANSGIS", source = c("local", "cdn", "ans"), lang = "es", modo = "light", favicon = NULL )
... |
contenido del body. |
titulo |
titulo del documento. |
source |
origen de los assets (ver 'ansgis_dep'). |
lang |
atributo lang del html. |
modo |
"light" o "dark" (clase de tema de Calcite). |
Panel con encabezado y acciones (calcite-panel)
ansgis_panel( ..., titulo = NULL, descripcion = NULL, acciones = NULL, barra = NULL, colapsable = FALSE )ansgis_panel( ..., titulo = NULL, descripcion = NULL, acciones = NULL, barra = NULL, colapsable = FALSE )
... |
contenido. |
titulo, descripcion
|
textos del encabezado. |
acciones |
lista de 'ansgis_action()' que van al encabezado. |
barra |
un 'ansgis_action_bar()' opcional (queda en el slot action-bar). |
colapsable |
si TRUE, agrega el boton de colapso. |
Reconoce, tal cual las define flexdashboard: - 'Column data-width=600' / 'Row data-height=200' subrayado con '—' (encabezado setext de nivel 2) –> contenedor - '### Titulo .tipo atributos' –> elemento - 'Algo .sidebar' –> la barra lateral
ansgis_parsear_tablero(lineas)ansgis_parsear_tablero(lineas)
htmltools NO registra 'knit_print.shiny.tag' (verificado: 'getS3method(..., optional = TRUE)' devuelve NULL), asi que lo ponemos nosotros. Cada chunk que devuelve un tag deja una marca en el markdown y el objeto en el ambiente.
ansgis_registrar_knit(reset = TRUE)ansgis_registrar_knit(reset = TRUE)
Escribe el documento a un archivo
ansgis_save(doc, archivo)ansgis_save(doc, archivo)
doc |
salida de 'ansgis_page()'. |
archivo |
ruta de destino. |
Marco de aplicacion (calcite-shell)
ansgis_shell( ..., titulo = NULL, subtitulo = NULL, panel_inicio = NULL, barra_inicio = NULL, panel_fin = NULL, pie = NULL, ancho_panel = "m", contenido_detras = TRUE )ansgis_shell( ..., titulo = NULL, subtitulo = NULL, panel_inicio = NULL, barra_inicio = NULL, panel_fin = NULL, pie = NULL, ancho_panel = "m", contenido_detras = TRUE )
... |
contenido central (tipicamente el mapa). |
titulo, subtitulo
|
textos de la barra de navegacion superior. |
panel_inicio |
contenido del panel lateral izquierdo. |
panel_fin |
contenido del panel lateral derecho. |
pie |
contenido del pie. |
ancho_panel |
"s", "m" o "l". |
contenido_detras |
si TRUE el contenido central va POR DEBAJO de los paneles (paneles flotantes, look de mapa a pantalla completa); si FALSE el panel ocupa su propio espacio y el mapa usa el resto (look de tablero). |
Control deslizante (calcite-slider)
ansgis_slider(id, min = 0, max = 100, valor = 50, paso = 1, etiquetas = TRUE)ansgis_slider(id, min = 0, max = 100, valor = 50, paso = 1, etiquetas = TRUE)
id |
id del control. |
min, max, valor, paso
|
rango y valor inicial. |
etiquetas |
muestra los extremos y el valor. |
Tabla Calcite a partir de un data.frame (calcite-table)
ansgis_table(df, titulo = "Tabla", rayada = TRUE, max_filas = 25)ansgis_table(df, titulo = "Tabla", rayada = TRUE, max_filas = 25)
df |
un data.frame. |
titulo |
caption de la tabla (requerido por accesibilidad en Calcite). |
rayada |
filas alternadas. |
max_filas |
cuantas filas emitir. |
Dependencia del CSS del dashboard
dash_css()dash_css()
Con 'sin_seleccion' se implementa el "Render only when filtered" del pliego: el elemento no renderiza hasta que hay seleccion en su fuente.
dash_detalles(id, titulo, sin_seleccion, ...)dash_detalles(id, titulo, sin_seleccion, ...)
Emite el documento del dashboard y engancha el runtime
dash_documento(doc)dash_documento(doc)
doc |
lista R que se serializa al JSON del dashboard (formato Esri). |
Grafico serial (serialChartWidget) — el SVG lo dibuja el runtime
dash_grafico(id, titulo, ...)dash_grafico(id, titulo, ...)
Tres areas de texto (top / middle / bottom) mas un icono opcional, como manda el pliego. El contenido lo escribe el runtime con los ocho calculos predefinidos; aca va el estado inicial ya calculado en R.
dash_indicador( id, titulo, top = "", medio = "", bajo = "", icono = NULL, color = NULL, ... )dash_indicador( id, titulo, top = "", medio = "", bajo = "", icono = NULL, color = NULL, ... )
Lista de features (listWidget), con caja de busqueda
dash_lista(id, titulo, buscar = TRUE, ...)dash_lista(id, titulo, buscar = TRUE, ...)
Del pliego (map-element-and-tools.htm) implementa: zoom +/-, extension por defecto, leyenda, visibilidad de capas y escala grafica. No hay mapa base: el header COEP que webR necesita bloquea los tiles de terceros.
dash_mapa(id, titulo, svg, leyenda = NULL, capas = NULL, ...)dash_mapa(id, titulo, svg, leyenda = NULL, capas = NULL, ...)
El pliego: "Progress gauges display where a value is in a quantitative context that is defined by minimum and maximum values... circle, horseshoe, or half circle". Herradura = arco de 270 grados.
dash_medidor( id, titulo, valor = "", sub = "", min = "0", max = "100", color = "#0079c1", pct = 0, ... )dash_medidor( id, titulo, valor = "", sub = "", min = "0", max = "100", color = "#0079c1", pct = 0, ... )
Selector de categoria, presentacion "barra de botones" (categorySelectorWidget)
dash_sel_chips(id, caption, valores, etiquetas = valores)dash_sel_chips(id, caption, valores, etiquetas = valores)
Selector de categoria, presentacion "lista" con busqueda y "seleccionar todo"
dash_sel_lista( id, etiqueta, valores, etiquetas = valores, buscar = TRUE, multiple = TRUE )dash_sel_lista( id, etiqueta, valores, etiquetas = valores, buscar = TRUE, multiple = TRUE )
Selector numerico / de fecha: slider de rango (number/dateSelectorWidget)
dash_sel_rango( id, etiqueta, min, max, paso, valor_ini, pista = NULL, ticks = NULL )dash_sel_rango( id, etiqueta, min, max, paso, valor_ini, pista = NULL, ticks = NULL )
Emite las 7 partes del pliego: columnas, rule line, header, filas, rayado, grilla y fila de resumen. Las filas las llena el runtime.
dash_tabla(id, titulo, columnas, resumen = "Total", ...)dash_tabla(id, titulo, columnas, resumen = "Total", ...)
Texto enriquecido (richTextWidget), modo "Statistic"
dash_texto(id, titulo = NULL, html = "", ...)dash_texto(id, titulo = NULL, html = "", ...)
Grafico de torta / dona (pieChartWidget)
dash_torta(id, titulo, ...)dash_torta(id, titulo, ...)
Marco comun de todo elemento del dashboard
dash_widget( id, titulo = NULL, ..., info = NULL, caption = NULL, caption_pie = NULL, clase = NULL )dash_widget( id, titulo = NULL, ..., info = NULL, caption = NULL, caption_pie = NULL, clase = NULL )
id |
id del elemento (el mismo que lleva en el documento JSON). |
titulo |
texto del header. |
... |
el area de visualizacion. |
info |
texto de "More information" (tooltip del icono). |
caption |
caption superior; 'caption_pie', el inferior. |