knitr::knit_hooks$set( error = function(x, options) { paste('\n\n<div class="alert alert-danger">', gsub('##', '\n', gsub('^##\ Error', '**Error**', x)), '</div>', sep = '\n') }, warning = function(x, options) { paste('\n\n<div class="alert alert-warning">', gsub('##', '\n', gsub('^##\ Warning:', '**Warning**', x)), '</div>', sep = '\n') }, message = function(x, options) { paste('\n\n<div class="alert alert-info">', gsub('##', '\n', x), '</div>', sep = '\n') } )
work.dir <- params$work.dir PAGE.WITH <- as.numeric(params$max_pic_size) # check for working dir if (!file.exists(work.dir)) { knitr::knit_exit() stop(paste0("work.dir '", work.dir, "' does not exist")) } # check if at least one model was selected model.dirs <- params$models model.dirs <- model.dirs[!is.null(model.dirs) || !is.na(model.dirs)] if (length(model.dirs) == 0) { knitr::knit_exit() stop("No model was set for evaluation") } if (length(model.dirs) > 4) { knitr::knit_exit() stop("The comparison of more than 4 models is not supported") } # check for model folders and pksh_eval.json # all data that we need is now in model.data !! model.dirs <- file.path(work.dir, model.dirs) model.data <- list() for (d in model.dirs) { if (!file.exists(d)) { knitr::knit_exit() stop(paste0("Model directory '", d, "' does not exist")) } meta.file <- file.path(d, "pksh_eval.json") if (!file.exists(meta.file)) { stop(paste0("pksh_eval.json in directory '", d, "' does not exist")) } else { meta.entry <- list(path = d, meta = jsonlite::read_json(file.path(d, "pksh_eval.json"))) model.data <- c(model.data, list(meta.entry)) } } tabs <- if (params$use_tabs) "{.tabset}" else "" PIC_SIZE <- floor(PAGE.WITH / length(model.data))
########################################################################################### # Helper functions suppressMessages(library(tidyverse)) plot_image <- function(file.name, model_name) { if (length(file.name) == 0 || !file.exists(file.name)) { plot.new() image(matrix(PIC_SIZE, PIC_SIZE), col = "white", axes = F) text(x = 0.5, y = 0, paste("Plot for", model_name, "is missing"), col = "red") } else { cat(sprintf('![](%s){ width=%ipx }', URLencode(file.name), PIC_SIZE), sep = '\n\n') cat(" ") } } get_model_names <- function(data) sapply(data, function(x) x$meta$model_name[[1]], simplify = T) get_model_paths <- function(data) sapply(data, function(x) x$path, simplify = T) print_comp_phrase <- function(names) cat(paste("Comparing __", paste(names, collapse = "__ vs __"), "__\n\n", sep = "")) ###########################################################################################
if (params$show_settings) { cat("# Settings") model_names <- get_model_names(model.data) model_paths <- get_model_paths(model.data) row.names <- c("Workding dir", paste("Model", 1:length(model.data))) settings.table <- data.frame(keys = row.names, names = c(" ", model_names), paths = c(work.dir, model_paths)) knitr::kable(settings.table, col.names = c("Key", "Name", "Path")) }
if (params$show_individuals_lin || params$show_individuals_log) { cat("# Individual Time Profiles \n") model_names <- get_model_names(model.data) model_paths <- get_model_paths(model.data) profile_names <- model.data %>% purrr::map(function(x) names(x$meta$individuals)) %>% unlist() %>% unique() if (length(profile_names) == 0) { knitr::knit_exit() stop("No individual profiles found") } for (profile in profile_names) { cat(sprintf("## %s %s \n\n", profile, tabs)) print_comp_phrase(model_names) if (params$show_individuals_lin) { cat("### Linear \n\n") for (i in 1:length(model.data)) { tmp_data <- model.data[[i]]$meta lin_file <- file.path(model_paths[i], tmp_data$individual[[profile]]$lin[[1]]) plot_image(lin_file, model_names[i]) } cat("<br/>\n\n") } if (params$show_individuals_log) { cat("### Logarithmic \n\n") for (i in 1:length(model.data)) { tmp_data <- model.data[[i]]$meta log_file <- file.path(model_paths[i], tmp_data$individual[[profile]]$log[[1]]) plot_image(log_file, model_names[i]) } cat("<br/>\n\n") } } }
if (params$show_pred_obs) { cat(sprintf("# Prediction vs. Overved Plots %s \n\n", tabs)) model_names <- get_model_names(model.data) model_paths <- get_model_paths(model.data) pred_obs_names <- model.data %>% purrr::map(function(x) names(x$meta$pred_obs)) %>% unlist() %>% unique() if (length(pred_obs_names) == 0) { knitr::knit_exit() stop("No prediction vs observed files found") } for (pred_obs in pred_obs_names) { cat(sprintf("## %s \n\n", pred_obs)) print_comp_phrase(model_names) for (i in 1:length(model.data)) { tmp_data <- model.data[[i]]$meta file <- file.path(model_paths[i], tmp_data$pred_obs[[pred_obs]][[1]]) plot_image(file, model_names[i]) } cat("<br/>\n\n") } }
if (params$show_gof) { cat(paste("# GoF Plots", tabs, "\n")) model_names <- get_model_names(model.data) model_paths <- get_model_paths(model.data) # cmax cat("## Cmax\n\n") print_comp_phrase(model_names) for (i in 1:length(model.data)) { tmp_data <- model.data[[i]]$meta file <- file.path(model_paths[i], tmp_data$gof$c_max[[1]]) plot_image(file, model_names[i]) } cat("<br/>\n\n") # AUC cat("## AUC\n\n") cat(paste("Comparing __", paste(model_names, collapse = "__ vs __"), "__\n\n", sep = "")) for (i in 1:length(model.data)) { tmp_data <- model.data[[i]]$meta file <- file.path(model_paths[i], tmp_data$gof$auc[[1]]) plot_image(file, model_names[i]) } cat("<br/>\n\n") }
if (params$show_metrics) { cat(paste("# Metrics", tabs, "\n")) model_names <- get_model_names(model.data) model_paths <- get_model_paths(model.data) all_data <- list() for (i in 1:length(model.data)) { tmp_data <- model.data[[i]]$meta file <- file.path(model.data[[i]]$path, tmp_data$cor_stats[[1]]) data <- read.table(file, header = T, sep = "\t") if (length(params$metrics) != 1 || tolower(params$metrics[1]) != "all") { data <- data[params$metrics] } tmp <- as.data.frame(t(data)) all_data[[i]] <- tmp } combined <- do.call("cbind", all_data) # remove a couple of not really interesting metrics cmax <- combined[seq(1, by = 3, length.out = length(model_names))] colnames(cmax) <- model_names auc <- combined[seq(3, by = 3, length.out = length(model_names))] colnames(auc) <- model_names }
if (params$show_metrics) { cat("## Cmax\n\n") knitr::kable(cmax) }
if (params$show_metrics) { cat("## AUC\n\n") knitr::kable(auc) }
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.