Agrega a un ViewDefinition una condición FHIRPath con los códigos de una
expansión (de tx_expandir() o hecha a mano), para que la vista quede
autocontenida: vista_ejecutar() y vista_ejecutar_duckdb() la aplican
sin consultar el servidor de terminología. Así un indicador definido con
un ValueSet (por ejemplo, "todas las personas con diagnóstico de
diabetes") se expande una vez y se calcula sobre millones de recursos sin
red.
Arguments
- vista
Un
ViewDefinitionen cualquier forma que aceptevista_leer().- expansion
Un
data.framecon las columnassystemycode, como el que devuelvetx_expandir().- ruta
Expresión FHIRPath, desde el recurso, que lleva a los
Codingque se comparan:"code.coding"(por defecto, paraCondition,ObservationoProcedure),"valueCodeableConcept.coding","medication.ofType(CodeableConcept).coding","class", etc.- nombre
Prefijo de las constantes que se agregan a la vista. Debe ser un nombre válido de FHIRPath.
- columna
Si es
NULL(por defecto), la condición se agrega comowherey la vista solo devuelve los recursos con algún código delValueSet. Si es un texto, en vez de filtrar se agrega una columna lógica con ese nombre que indica si el recurso tiene algún código delValueSet; sirve para marcar varios grupos en una misma vista.
Details
Cada sistema de codificación y su lista de códigos se guardan como
constantes de la vista (%{nombre}_sistema y %{nombre}_codigos, o
_sistema_1, _codigos_1... si hay varios sistemas); la lista es un texto
con los códigos separados por |. La condición queda, por ejemplo:
code.coding.where(system = %vs_sistema and %vs_codigos.contains('|' & code & '|')).exists()
Esta forma (y no una cadena de or) mantiene la expresión corta aunque el
ValueSet tenga miles de códigos, y el motor DuckDB la traduce a una sola
búsqueda de texto. La vista guarda en su JSON la lista exacta que se usó,
lo que también documenta el indicador.
Examples
# Expansión hecha a mano (normalmente sale de tx_expandir())
diabetes <- data.frame(
system = "http://hl7.org/fhir/sid/icd-10",
code = c("E10", "E11", "E13", "E14")
)
vista <- vista_crear("Condition", c(
paciente = "subject.getReferenceKey(Patient)",
codigo = "code.coding.first().code"
))
vista <- vista_con_valueset(vista, diabetes, nombre = "diabetes")
vista$where
#> [[1]]
#> [[1]]$path
#> [1] "code.coding.where(system = %diabetes_sistema and %diabetes_codigos.contains('|' & code & '|')).exists()"
#>
#>
condiciones <- fhir_recursos(list(
list(resourceType = "Condition", id = "c1",
subject = list(reference = "Patient/p1"),
code = list(coding = list(list(
system = "http://hl7.org/fhir/sid/icd-10", code = "E11")))),
list(resourceType = "Condition", id = "c2",
subject = list(reference = "Patient/p2"),
code = list(coding = list(list(
system = "http://hl7.org/fhir/sid/icd-10", code = "I10"))))
))
vista_ejecutar(condiciones, vista)
#> id paciente codigo
#> 1 c1 p1 E11
# Con un servidor de terminología
tx <- fhir_conectar("https://tx.fhir.org/r4", panel = FALSE)
sexo <- tx_expandir(tx, "http://hl7.org/fhir/ValueSet/administrative-gender")
sexo
#> system code display
#> 1 http://hl7.org/fhir/administrative-gender male Male
#> 2 http://hl7.org/fhir/administrative-gender female Female
#> 3 http://hl7.org/fhir/administrative-gender other Other
#> 4 http://hl7.org/fhir/administrative-gender unknown Unknown
