The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
library(engager)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(ggplot2)The engager package helps instructors analyze student
engagement from Zoom transcripts, with a particular focus on
participation equity. This vignette will get you started with the basic
workflow.
The beginner workflow loads, processes, summarizes, plots, and exports one transcript with privacy-supporting defaults:
transcript_file <- system.file(
"extdata/test_transcripts/intro_statistics_week1.vtt",
package = "engager"
)
results <- basic_transcript_analysis(
transcript_file,
output_dir = tempfile("engager-getting-started-")
)
#> Creating output directory: /var/folders/qc/9yj3rswj3kg2lyyl6gv5t7_w0000gn/T//Rtmpb3BGWp/engager-getting-started-17b3d5610cc0e
#> ==> Starting Basic Transcript Analysis
#> ========================================
#> FILE: File: intro_statistics_week1.vtt
#> DIR: Output: /var/folders/qc/9yj3rswj3kg2lyyl6gv5t7_w0000gn/T//Rtmpb3BGWp/engager-getting-started-17b3d5610cc0e
#> PRIVACY: Privacy: high
#>
#> Step 1/5: Loading transcript...
#> SUCCESS: Loaded 56 transcript entries
#> Step 2/5: Processing transcript...
#> SUCCESS: Processed transcript data
#> Step 3/5: Analyzing engagement...
#> SUCCESS: Calculated engagement metrics
#> Step 4/5: Creating visualizations...
#> SUCCESS: Created engagement visualizations
#> Step 5/5: Exporting results...
#> SUCCESS: Exported results to /var/folders/qc/9yj3rswj3kg2lyyl6gv5t7_w0000gn/T//Rtmpb3BGWp/engager-getting-started-17b3d5610cc0e
#>
#> COMPLETE: Basic analysis complete!
#> RESULTS: Results saved to: /var/folders/qc/9yj3rswj3kg2lyyl6gv5t7_w0000gn/T//Rtmpb3BGWp/engager-getting-started-17b3d5610cc0e
#> TIP: Next steps:
#> - Check the output files in /var/folders/qc/9yj3rswj3kg2lyyl6gv5t7_w0000gn/T//Rtmpb3BGWp/engager-getting-started-17b3d5610cc0e
#> - Use show_available_functions() to see more options
#> - Use set_ux_level('intermediate') for more functions
head(results$analysis)
#> # A tibble: 4 × 13
#> transcript_file name n duration wordcount comments perc_n perc_duration
#> <chr> <chr> <int> <dbl> <dbl> <I<int>> <dbl> <dbl>
#> 1 intro_statistics… Stud… 14 155 361 14 46.7 71.8
#> 2 intro_statistics… Stud… 6 23 48 6 20 10.6
#> 3 intro_statistics… Stud… 5 19 37 5 16.7 8.80
#> 4 intro_statistics… Stud… 5 19 40 5 16.7 8.80
#> # ℹ 5 more variables: perc_wordcount <dbl>, n_perc <dbl>, duration_perc <dbl>,
#> # wordcount_perc <dbl>, wpm <dbl>
print(results$plots)For explicit control, compose the public processing functions and pass the processed object forward instead of re-reading the file:
transcript <- load_zoom_transcript(transcript_file)
processed <- process_zoom_transcript(
transcript_df = transcript,
consolidate_comments = TRUE,
add_dead_air = TRUE
)
summary_metrics <- summarize_transcript_metrics(
transcript_df = processed,
names_exclude = c("dead_air")
)
# View the results (recognized structured identifiers are masked by default)
head(summary_metrics)
#> # A tibble: 4 × 13
#> transcript_file name n duration wordcount comments perc_n perc_duration
#> <chr> <chr> <int> <dbl> <dbl> <I<list> <dbl> <dbl>
#> 1 intro_statistics… Stud… 14 155 361 <chr> 46.7 71.8
#> 2 intro_statistics… Stud… 6 23 48 <chr> 20 10.6
#> 3 intro_statistics… Stud… 5 19 37 <chr> 16.7 8.80
#> 4 intro_statistics… Stud… 5 19 40 <chr> 16.7 8.80
#> # ℹ 5 more variables: perc_wordcount <dbl>, n_perc <dbl>, duration_perc <dbl>,
#> # wordcount_perc <dbl>, wpm <dbl>
# Run a technical privacy review
privacy_result <- privacy_audit(summary_metrics)
cat(
"Privacy review:",
ifelse(nrow(privacy_result) == 0, "No recognized issues flagged", "Review flags returned"),
"\n"
)
#> Privacy review: Review flags returnedThe engager package provides tools for:
The typical workflow involves:
Version 0.1.0 provides per-session metrics, summaries, and plot objects. It does not generate a polished course-level engagement report or support longitudinal individual-student reporting.
match_names_workflow() compares normalized transcript
speakers with roster names and aliases. Version 0.1.0 supports exact
matching only and reports unresolved speakers instead of guessing.
roster <- tibble::tibble(
preferred_name = c("Alice Smith", "Bob Jones"),
student_id = c("S1", "S2"),
aliases = c("A Smith; Alice S", NA_character_)
)
transcripts <- tibble::tibble(
speaker = c("alice smith", "carol"),
timestamp = as.POSIXct(
c("2025-01-01 10:00:00", "2025-01-01 10:01:00"),
tz = "UTC"
)
)
matching <- match_names_workflow(
transcripts,
roster,
options = list(match_strategy = "exact")
)
matching
#> engager_match: 1/2 matched; 1 unresolved
matching$unresolved
#> name_hash reason
#> 2 4c26d9074c27d89ede59270c0ac14b71e071b15239519f75474b2f3ba63481f5 no_candidate
#> guidance timestamp
#> 2 Add alias to roster or correct transcript 2025-01-01 10:01:00Review unresolved speakers locally before deciding whether to add an
authorized roster alias or leave the speaker unresolved. See
?write_unresolved for the privacy-supporting
unresolved-name export.
For detailed troubleshooting guidance: - Check the package
documentation: ?match_names_workflow -
Find unmatched names before matching:
?detect_unmatched_names - Review the supported
workflow: See ?match_names_workflow and
?write_unresolved
vignette("plotting")vignette("essential-functions")vignette("privacy-ethics-review")help(package = "engager")browseVignettes(package = "engager")https://github.com/revgizmo/engager/issuesThese binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.