Utiliser la console

Utiliser la console R ou Python dans LinkR

Introduction

La console de LinkR vous permet d'exécuter des requêtes en R, Python ou en ligne de commande (Bash).


Nous allons voir comment :

  • Utiliser la console dans LinkR
  • Requêter des données OMOP
  • Requêter les autres variables de l'application

Utiliser la console

La page Console est accessible depuis n’importe quelle page de l’application, en cliquant sur le lien correspondant en haut de l’écran.

Vous arrivez sur une page avec :

  • Le choix du langage de programmation et de la sortie
  • Un éditeur de code
  • Un bloc où sera affiché le résultat de l’exécution du code

Commencez par choisir le langage de programmation et la sortie à utiliser.

Nous allons commencer par voir les différentes sorties disponibles en R :

  • Console : le résultat affiché sera celui qui serait affiché dans la console R
  • Figure : correspond à un figureOutput de Shiny
  • Table : correspond à un tableOutput de Shiny
  • DataTable : correspond à un DT::DTOutput de DT et Shiny
  • UI (HTML) : le résultat sera affiché dans un uiOutput de Shiny
  • RMarkdown : correspond à l’HTML sortant de la conversion du fichier RMarkdown présenté dans la console

Nous allons voir les sorties avec des exemples. Pour cela, chargez le projet Démo LinkR, afin de charger les données de la MIMIC-IV.

Raccourcis


Vous pouvez utiliser ces raccourcis, lorsque votre curseur est dans l'éditeur de code :

  • CTRL/CMD + ENTER sans sélection : exécute la ligne (ou le bloc de code quel appartient la ligne)
  • CTRL/CMD + ENTER avec du texte sélectionné : exécute uniquement le texte sélectionné
  • CTRL/CMD + SHIFT + ENTER : exécute tout le code de l'éditeur

R - Console

Sélectionnez la sortie “Console”, écrivez d$person dans l’éditeur de texte et exécutez le code (avec le bouton Exécuter ou avec le raccourci).

R - Figure

Voici un exemple permettant de créer un histogramme affichant l’âge des patients du set de données associé au projet.

Sélectionnez la sortie “Figure” et exécutez ce code. Notez que vous pouvez configurer les dimensions et la résolution de l’image.

d$visit_occurrence %>%
    dplyr::left_join(
        d$person %>% dplyr::select(person_id, birth_datetime),
        by = "person_id"
    ) %>%
    dplyr::collect() %>%
    dplyr::mutate(
        age = round(
            as.numeric(
                difftime(visit_start_datetime, birth_datetime, units = "days")
            ) / 365.25, 1
        )
    ) %>%
    ggplot2::ggplot(ggplot2::aes(x = age)) +
    ggplot2::geom_histogram(binwidth = 5, fill = "#0084D8", color = "white") +
    ggplot2::labs(
        x = "Age (années)",
        y = "Fréquence"
      ) +
    ggplot2::theme_minimal() +
    ggplot2::theme(
        plot.title = ggplot2::element_text(size = 16, face = "bold"),
        axis.title = ggplot2::element_text(size = 14)
    )

R - Table

La sortie “Table” affiche le dataframe en entier, avec la fonction tableOutput de Shiny.

R - DataTable

La sortie “DataTable” utilie la librairie DT pour afficher les résultats, qui permet un meilleur affichage que “Table”, avec un système de pages.

A noter que les données doivent être en mémoire pour être affichées.

Il faudra donc écrire :

d$person %>% dplyr::collect()

R - RMarkdown

La sortie “RMarkdown” interprète le code comme un fichier .Rmd.

Le Markdown sera converti en HTML et le code R sera interprété.

Python - Console

Un exemple simple d’utilisation de la console en Python :

import numpy as np

# Générer des données aléatoires
data = np.random.normal(loc=50, scale=10, size=1000)

print(data)

Python - Matplotlib

Il est également possible d’utiliser la librariie Matplotlib pour créer des figures :

import matplotlib.pyplot as plt
import numpy as np

# Générer des données aléatoires
data = np.random.normal(loc=50, scale=10, size=1000)

# Créer l'histogramme
plt.hist(data, bins=20, color="#0084D8", edgecolor="white")

# Ajouter des labels et un titre
plt.title("Distribution des valeurs")
plt.xlabel("Valeurs")
plt.ylabel("Fréquence")

# Afficher le graphique
plt

Requêter des données OMOP

Une fois des données chargées (en chargeant un projet associé à un set de données ou en chargeant un set de données directement), les données deviennent accessibles depuis la console, par deux moyens :

  • Par les variables R préfixées d$ (d pour data)
  • Par des requêtes SQL en utilisant la fonction R get_query

Toutes les tables OMOP sont disponibles par ces deux méthodes.

Variables R

Nous avons vu dans les exemples ci-dessus l’utilisation des variables préfixées d$ (d$person, d$measurement etc).

Ces données sont chargées au format lazy, ce qui veut dire qu’elles ne sont pas chargées en mémoire (ce qui permet d’afficher rapidement la variable, même si elle contient plusieurs milliards de lignes). Une fois les opérations de filtre réalisées, il est possible de collecter ces données en mémoire avec la fonction dplyr::collect().

Dans l’exemple suivant, on filtre les données de la table Measurement sur le person_id 2562658 et sur le measurement_concept_id 3027018 (correspondant au concept LOINC - Heart rate).

d$measurement %>%
    dplyr::filter(
        person_id == 2562658,
        measurement_concept_id == 3027018
    ) %>%
    dplyr::collect()

A noter que ces tables sont également disponibles pour le groupe de patients (ou subset) sélectionné, avec la liste d$data_subset.

Ceci affichera la liste des patients du groupe sélectionné :

d$data_subset$person

Requêtes SQL

Par souci d’interopérabilité, il est nécessaire de pouvoir requêter les tables OMOP en SQL.

Lorsque vous importez des données dans LinkR, il s’agit toujours d’une connexion à une base de donnnées (même lorsque vous importez des fichiers SQL ou Parquet, qui sont lus sous forme d’une connexion DuckDB).

Il est possible de requêter les données en SQL, via la fonction R get_query.

Ce code vous permet donc d’afficher toutes les données de la table patient :

get_query("SELECT * FROM person")

Vous pouvez également utiliser les requêtes SQL du tutoriel requêtes OMOP usuelles.

Cette requête, extraite de ce tutoriel, vous permet d’obtenir l’âge des patients :

get_query("
    SELECT 
        v.visit_occurrence_id,
        v.person_id,
        ROUND(
            EXTRACT(EPOCH FROM (
                CAST(v.visit_start_datetime AS TIMESTAMP) - 
                CAST(p.birth_datetime AS TIMESTAMP)
            )) / (365.25 * 86400), 
            1
        ) AS age
    FROM 
        visit_occurrence v
    LEFT JOIN 
        (SELECT person_id, birth_datetime FROM person) p
    ON 
        v.person_id = p.person_id;
")

Requêter les autres variables

D’autres variables, préfixées m$, peuvent être requêtées depuis la console. Ces variables ont pour objectif d’être utilisées dans les plugins.

En voici la liste :

  • m$selected_subset : affiche l’ID du groupe de patients sélectionné via le menu déroulant
  • m$selected_person : ID du patient sélectionné via le menu déroulant
  • m$selected_visit_detail : ID du séjour hospitalier sélectionné via le menu déroulant
  • m$subsets : liste des groupes de patients disponibles pour le projet ouvert
  • m$subset_persons : liste des patients appartenant au groupe de patients (subset) sélectionné

Conclusion

Nous avons vu comment la console de LinkR nous permet d'exécuter des requêtes en R ou Python, en choisissant le format de sortie (console, figure, tableua de données etc).


Nous avons également vu comment manier les données d'un projet chargé, ce qui nous sera utile pour créer notre premier plugin dans la section suivante.