screenllm screening report

knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE)
project   <- params$project
ranked    <- params$ranked
plan      <- params$plan
decisions <- params$decisions
criteria  <- params$criteria
ensemble  <- params$ensemble

Project: r if (is.null(project)) "(unnamed)" else project Generated: r format(Sys.time(), "%Y-%m-%d %H:%M %Z") Package: screenllm r packageVersion("screenllm")

Ensemble

if (!is.null(ensemble)) {
  cat("Aggregator:", ensemble$aggregator, "\n")
  cat("Replicates per model:", ensemble$replicates, "\n")
  cat("Temperature:", ensemble$temperature, "\n")
  cat("Backend:", ensemble$backend$name, "\n")
  cat("Models:\n")
  for (m in ensemble$models) cat("  -", m, "\n")
} else {
  cat("(No ensemble configuration recorded.)\n")
}

Inclusion criteria

if (!is.null(criteria)) {
  cat("**Scope:**", criteria$scope, "\n\n")
  cat("**Criteria:**\n\n")
  for (i in seq_along(criteria$inclusions)) {
    cat(sprintf("%d. %s\n", i, criteria$inclusions[[i]]))
  }
} else {
  cat("_(No criteria recorded.)_\n")
}

SAFE plan

if (!is.null(plan)) {
  print(plan)
} else {
  cat("(No plan recorded.)\n")
}

Ranking summary

if (!is.null(ranked)) {
  cat("Records ranked:", nrow(ranked), "\n")
  if ("universal_best_score" %in% names(ranked)) {
    cat("Score range:", sprintf("%.1f - %.1f",
      min(ranked$universal_best_score, na.rm = TRUE),
      max(ranked$universal_best_score, na.rm = TRUE)), "\n")
  }
} else {
  cat("(No ranking recorded.)\n")
}

Human decisions

if (!is.null(decisions)) {
  tbl <- table(decisions$human_decision, useNA = "ifany")
  print(tbl)
  cat("\nTotal decisions:", nrow(decisions), "\n")
} else {
  cat("(No decisions recorded yet.)\n")
}

Screening summary

if (!is.null(ranked) && !is.null(decisions)) {
  rep <- summarise_screening(ranked, decisions, plan = plan)
  print(rep)
} else {
  cat("(Need both ranking and decisions to compute summary.)\n")
}

Strong LLM-vs-human disagreements

Records where the LLM ensemble and the human reviewer disagreed most strongly. Useful for a final audit pass, and per the paper's finding, these are worth double-checking as they can flag human-labelling errors.

if (!is.null(ranked) && !is.null(decisions)) {
  aud <- audit_disagreements(ranked, decisions)
  if (nrow(aud) == 0L) {
    cat("No strong disagreements identified.\n")
  } else {
    keep <- intersect(
      c("id", "title", "universal_best_score", "human_decision",
        "disagreement"),
      names(aud)
    )
    knitr::kable(aud[, keep, drop = FALSE], row.names = FALSE)
  }
} else {
  cat("(Need both ranking and decisions to run audit.)\n")
}

Generated by screenllm::export_report(). To save as PDF, use your browser's Print > Save as PDF.



Try the screenllm package in your browser

Any scripts or data that you put into this service are public.

screenllm documentation built on Sept. 24, 2026, 5:11 p.m.