knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file()) # Set WD to Root here::i_am("dev/hrv-old.Rmd") library(testthat) library(here)
read_HRV_report <- function(file, ignore_missing_files = FALSE, text_field = NULL, docid_field = NULL, docvarsfrom = c("metadata", "filenames", "filepaths"), dvsep = "_", docvarnames = NULL, encoding = "UTF-16LE", source = NULL, cache = TRUE, format_cols = TRUE, ... ) { report_df <- readtext::readtext(file = file, ignore_missing_files = ignore_missing_files, text_field = text_field, docid_field = docid_field, docvarsfrom = docvarsfrom, dvsep = dvsep, docvarnames = docvarnames, encoding = encoding, source = source, cache = cache, ...) %>% tibble::tibble() %>% dplyr::mutate( # Line 1 File_LabChart = stringr::str_extract(text, .fields_regex[["File_LabChart"]]), Channel = stringr::str_extract(text, .fields_regex[["Channel"]]), Date = stringr::str_extract(text, .fields_regex[["Date"]]), # Line 2 Start_time = stringr::str_extract(text, .fields_regex[["Start_time"]]), End_time = stringr::str_extract(text, .fields_regex[["End_time"]]), # Line 3 Name = stringr::str_extract(text, .fields_regex[["Name"]]), Gender = stringr::str_extract(text, .fields_regex[["Gender"]]), Age = stringr::str_extract(text, .fields_regex[["Age"]]), # Line 4 Beats_tot = stringr::str_extract(text, .fields_regex[["Beats_tot"]]), Rec_length = stringr::str_extract(text, .fields_regex[["Rec_length"]]), # Line 5 Class_bound = stringr::str_extract(text, .fields_regex[["Class_bound"]]), # Line 6 Discontinuities = stringr::str_extract(text, .fields_regex[["Discontinuities"]]), Beats_inserted = stringr::str_extract(text, .fields_regex[["Beats_inserted"]]), Beats_deleted = stringr::str_extract(text, .fields_regex[["Beats_deleted"]]), # Line 7 NN_max = stringr::str_extract(text, .fields_regex[["NN_max"]]), NN_min = stringr::str_extract(text, .fields_regex[["NN_min"]]), NN_range = stringr::str_extract(text, .fields_regex[["NN_range"]]), # Line 8 NN_mean = stringr::str_extract(text, .fields_regex[["NN_mean"]]), NN_median = stringr::str_extract(text, .fields_regex[["NN_median"]]), HR_avg = stringr::str_extract(text, .fields_regex[["HR_avg"]]), # Line 9 SDNN = stringr::str_extract(text, .fields_regex[["SDNN"]]), SD_del_NN = stringr::str_extract(text, .fields_regex[["SD_del_NN"]]), RMSSD = stringr::str_extract(text, .fields_regex[["RMSSD"]]), # Line 10 Normals_count = stringr::str_extract(text, .fields_regex[["Normals_count"]]), Ectopics_count = stringr::str_extract(text, .fields_regex[["Ectopics_count"]]), Artifacts_count = stringr::str_extract(text, .fields_regex[["Artifacts_count"]]), NN50_count = stringr::str_extract(text, .fields_regex[["NN50_count"]]), # Line 11 Spec_intv = stringr::str_extract(text, .fields_regex[["Spec_intv"]]), Spec_mean_NN = stringr::str_extract(text, .fields_regex[["Spec_mean_NN"]]), # Line 12 Power_tot = stringr::str_extract(text, .fields_regex[["Power_tot"]]), VLF_freq = stringr::str_extract(text, .fields_regex[["VLF_freq"]]), VLF = stringr::str_extract(text, .fields_regex[["VLF"]]) %>% stringr::str_extract(.fields_regex[["after_equal"]]), # Last line LF_freq = stringr::str_extract(text, .fields_regex[["LF_freq"]]), LF = stringr::str_extract(text, .fields_regex[["LF"]]) %>% stringr::str_extract(.fields_regex[["after_equal"]]), LF_nu = stringr::str_extract(text, .fields_regex[["LF_nu"]]), HF_freq = stringr::str_extract(text, .fields_regex[["HF_freq"]]), HF = stringr::str_extract(text, .fields_regex[["HF"]]) %>% stringr::str_extract(.fields_regex[["after_equal"]]), HF_nu = stringr::str_extract(text, .fields_regex[["HF_nu"]]), LF_HF = stringr::str_extract(text, .fields_regex[["LF_HF"]]) %>% stringr::str_extract(.fields_regex[["after_equal"]]) ) %>% purrr::map_df(~stringr::str_trim(.x, side = "both")) if( !format_cols){ return(report_df) } ## Format column report_df %>% dplyr::mutate(dplyr::across(c(Channel, Gender), factor), dplyr::across(Age, as.integer), dplyr::across(c(Beats_tot,Rec_length, Discontinuities:Power_tot, VLF,LF, LF_nu, HF, HF_nu, LF_HF), as.numeric) ) %>% # Add pNN50 dplyr::mutate(NN50_percent = 100 * (NN50_count/Normals_count), .after = NN50_count) }
.fields_regex <- c( # Line 1 File_LabChart = c("(?<=File: \").+(?=\")"), Channel = c("(?<=Channel: ).+(?=Date)"), Date = c("(?<=Date: ).+"), # Line 2 Start_time = c("(?<=Start time: ).+(?=End time)"), End_time = c("(?<=End time: ).+"), # Line 3 Name = c("(?<=Name: )[:graph:]+"), Gender = c("(?<=Gender: )[:alpha:]+"), Age = c("(?<=Age: )([:digit:]|[:punct:])+"), # Line 4 Beats_tot = c("(?<=Total number of beats = )([:digit:]|[:punct:])+"), Rec_length = c("(?<=Length of recording = )([:digit:]|[:punct:])+"), # Line 5 Class_bound = c("(?<=Classification boundaries: ).+"), # Line 6 Discontinuities = c("(?<=Discontinuities = )([:digit:]|[:punct:])+"), Beats_inserted = c("(?<=Manually inserted beats = )([:digit:]|[:punct:])+"), Beats_deleted = c("(?<=Manually deleted beats = )([:digit:]|[:punct:])+"), # Line 7 NN_max = c("(?<=Maximum NN = )([:digit:]|[:punct:])+"), NN_min = c("(?<=Minimum NN = )([:digit:]|[:punct:])+"), NN_range = c("(?<=Range = )([:digit:]|[:punct:])+"), # Line 8 NN_mean = c("(?<=Mean NN = )([:digit:]|[:punct:])+"), NN_median = c("(?<=Median NN = )([:digit:]|[:punct:])+"), HR_avg = c("(?<=Average heart rate = )([:digit:]|[:punct:])+"), # Line 9 SDNN = c("(?<=SDNN = )([:digit:]|[:punct:])+"), SD_del_NN = c("(?<=SD of delta NN = )([:digit:]|[:punct:])+"), RMSSD = c("(?<=RMSSD = )([:digit:]|[:punct:])+"), # Line 10 Normals_count = c("(?<=Normals = )([:digit:]|[:punct:])+"), Ectopics_count = c("(?<=Ectopics = )([:digit:]|[:punct:])+"), Artifacts_count = c("(?<=Artifacts = )([:digit:]|[:punct:])+"), NN50_count = c("(?<=NN50 = )([:digit:]|[:punct:])+"), # Line 11 Spec_intv = c("(?<=Spectrum intervals = )([:digit:]|[:punct:])+"), Spec_mean_NN = c("(?<=Mean spectrum NN = )([:digit:]|[:punct:])+"), ## Extract after equal sign after_equal = c("(?<== )([:digit:]|[:punct:])+"), # Line 12 Power_tot = c("(?<=Total power = )([:digit:]|[:punct:])+"), VLF_freq = c("(?<=VLF \\().+(?=\\))"), VLF = c("VLF \\(.+\\) = ([:digit:]|[:punct:])+"), # Last Line LF_freq = c("(?<=((?<!V)(LF) \\())[^\\)]+"), LF = c("(?<!V)(LF) \\(.+\\) = ([:digit:]|[:punct:])+"), LF_nu = c("(\\.|[:digit:])+(?=( nu\\)[:blank:]+HF))"), HF_freq = c("(?<=((HF) \\())[^\\)]+"), HF = c("(HF) \\(.+\\) = ([:digit:]|[:punct:])+"), HF_nu = c("(\\.|[:digit:])+(?=( nu\\)[:blank:]+LF/HF))"), LF_HF = c("(LF/HF) = ([:digit:]|[:punct:])+") )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.