# Generate a Static AE Listing Table in RTF format

    library(metalite.ae)

## Overview

This vignette demonstrates how to generate a static adverse event (AE) listing focused on serious AEs in RTF format.

The listing presents participant-level details for adverse events of interest. Three functions support the workflow:

- `prepare_ae_listing()` prepares the listing dataset.
- `format_ae_listing()` formats the listing dataset.
- `tlf_ae_listing()` creates the RTF table.

## Step 1: Define metadata

The example uses ADSL and ADAE data from the forestly package.

    adsl <- forestly::forestly_adsl
    adae <- forestly::forestly_adae

    adsl$TRT01A <- factor(
      adsl$TRT01A,
      levels = c("Xanomeline Low Dose", "Placebo"),
      labels = c("Low Dose", "Placebo")
    )
    adae$TRTA <- factor(
      adae$TRTA,
      levels = c("Xanomeline Low Dose", "Placebo"),
      labels = c("Low Dose", "Placebo")
    )

    analysis_plan <- metalite::plan(
      analysis = "ae_listing",
      population = "apat",
      observation = "wk12",
      parameter = "ser"
    )

    meta <- metalite::meta_adam(observation = adae, population = adsl) |>
      metalite::define_plan(analysis_plan) |>
      metalite::define_population(
        name = "apat",
        var = c(
          "USUBJID", "SAFFL", "TRT01A", "TRTDUR",
          "SITEID", "SEX", "RACE", "AGE"
        ),
        group = "TRT01A",
        subset = SAFFL == "Y",
        label = "All Participants as Treated"
      ) |>
      metalite::define_observation(
        name = "wk12",
        var = c(
          "USUBJID", "SAFFL", "TRTA", "AEDECOD", "AEBODSYS", "AEREL",
          "AESER", "AEOUT", "AEACN", "AESDTH", "ASTDT", "AENDT"
        ),
        group = "TRTA",
        subset = SAFFL == "Y",
        label = "Weeks 0 to 12"
      ) |>
      metalite::define_parameter(
        name = "ser",
        term1 = "Serious",
        term2 = "",
        subset = AESER == "Y",
        var = "AEDECOD",
        soc = "AEBODSYS",
        label = "Serious AEs"
      ) |>
      metalite::define_analysis(
        name = "ae_listing",
        var_name = c(
          "USUBJID", "ASTDY", "AEDECOD", "ADURN",
          "AESEV", "AESER", "AEREL", "AEOUT"
        ),
        group_by = c("USUBJID", "ASTDY"),
        page_by = "TRTA"
      ) |>
      metalite::meta_build()

## Step 2: Generate the AE listing table

`prepare_ae_listing()` uses the population, observation, parameter, and analysis definitions in `meta` to prepare the listing dataset. `format_ae_listing()` organizes the prepared output, and `tlf_ae_listing()` creates the RTF table.

    footnote <- c(
      "Related: Investigator-assessed relationship of the adverse event to study medication. Y = RELATED, N = NOT RELATED",
      "Action Taken: Discontinued = DRUG WITHDRAWN, Interrupted = DRUG INTERRUPTED, Reduced = DOSE REDUCED, Increased = DOSE INCREASED, None = DOSE NOT CHANGED, N/A = NOT APPLICABLE.",
      "Outcome: Resolved = RECOVERED/RESOLVED, Resolving = RECOVERING/RESOLVING, Sequelae = RECOVERED/RESOLVED WITH SEQUELAE, Not resolved = NOT RECOVERED/NOT RESOLVED.",
      "Adverse event terms are from MedDRA Version 25.0."
    )

    rtf_dir <- if (dir.exists("vignettes/rtf")) "vignettes/rtf" else "rtf"
    rtf_file <- file.path(rtf_dir, "ae0listing1.rtf")

    prepare_ae_listing(
      meta,
      analysis = "ae_listing",
      population = "apat",
      observation = "wk12",
      parameter = "ser"
    ) |>
      format_ae_listing() |>
      tlf_ae_listing(
        footnotes = footnote,
        orientation = "portrait",
        source = "Source:  [CDISCpilot: adam-adsl; adae]",
        analysis = "ae_listing", # Provide analysis type defined in meta$analysis
        path_outtable = rtf_file
      )
    #> The output is saved in/private/var/folders/yy/6bb11gtn52z0qwdg1_6kdbg00000gn/T/RtmpBCvLa1/Rbuild12c86435ade20/metalite.ae/vignettes/rtf/ae0listing1.rtf

Generated RTF file: ae0listing1.rtf