From 118b0da2204dff3d923002d27bfdb7f8e4bb7aa2 Mon Sep 17 00:00:00 2001
From: "arsenij.ustjanzew" <arsenij.ustjanzew@mpi-bn.mpg.de>
Date: Thu, 2 Apr 2020 12:42:17 +0200
Subject: [PATCH] Added ANY signature to add_component for a generic way to add
 htmlwidgets

---
 DESCRIPTION                   |  1 +
 R/components.R                |  2 +-
 R/vis_objects.R               | 65 +++++++++++++----------------------
 inst/templates/vis_object.Rmd |  2 +-
 4 files changed, 26 insertions(+), 44 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index 674c5f7..f638530 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -23,6 +23,7 @@ Imports:
     glue,
     ymlthis
 Suggests: 
+    switchr,
     highcharter,
     plotly,
     crosstalk,
diff --git a/R/components.R b/R/components.R
index 0ebb9b9..dc726f3 100644
--- a/R/components.R
+++ b/R/components.R
@@ -59,7 +59,7 @@ setMethod("add_component",
           })
 
 setMethod("add_component", signature(dashboard = "i2dashboard", component = "function"),
-          function(dashboard, component, page = "default", title = NULL, ...) {
+          function(dashboard, component, page = "default", ...) {
             # validate "page" input
             name <- .create_page_name(page)
             if (!(name %in% names(dashboard@pages))) {
diff --git a/R/vis_objects.R b/R/vis_objects.R
index 0ac3237..3f2c244 100644
--- a/R/vis_objects.R
+++ b/R/vis_objects.R
@@ -29,7 +29,7 @@ add_vis_object <- function(dashboard, object, package, page = "default", title =
                                            delim = c("<%", "%>"),
                                            title = title,
                                            package = package,
-                                           class = class(object),
+                                           class = is(object),
                                            component_id = component_id,
                                            timestamp = timestamp)
 
@@ -42,61 +42,42 @@ add_vis_object <- function(dashboard, object, package, page = "default", title =
 # Methods to add common visualization objects
 #
 setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "highchart"),
+          signature = signature(dashboard = "i2dashboard", component = "gg"),
           definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "highcharter", page, title, ...) })
+            add_vis_object(dashboard, component, "ggplot2", page, title, ...) })
 
 setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "plotly"),
+          signature = signature(dashboard = "i2dashboard", component = "gt_tbl"),
           definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "plotly", page, title, ...) })
+            add_vis_object(dashboard, component,"gt", page, title, ...) })
 
 setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "leaflet"),
+          signature = signature(dashboard = "i2dashboard", component = "knitr_kable"),
           definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "leaflet", page, title, ...) })
+            add_vis_object(dashboard, component, "kableExtra", page, title, ...) })
 
 setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "dygraphs"),
+          signature = signature(dashboard = "i2dashboard", component = "Heatmap"),
           definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "dygraphs", page, title, ...) })
+            add_vis_object(dashboard, component, "ComplexHeatmap", page, title, ...) })
 
 setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "rbokeh"),
+          signature = signature(dashboard = "i2dashboard", component = "ANY"),
           definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "rbokeh", page, title, ...) })
 
-setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "visNetwork"),
-          definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "visNetwork", page, title, ...) })
+            # HTMLWIDGETS
+            if(inherits(component, "htmlwidget")) {
+              package <- packageSlot(component)
 
-setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "d3heatmap"),
-          definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "d3heatmap", page, title, ...) })
+              if(is.null(package)) {
+                warning("No component added, since the package name of the HTML widget could not be determined.")
+                return(dashboard)
+              }
 
-setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "metricsgraphics"),
-          definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "metricsgraphics", page, title, ...) })
+              return(add_vis_object(dashboard, component, package, page, title, ...))
+            }
 
-setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "gg"),
-          definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "ggplot2", page, title, ...) })
-
-setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "datatables"),
-          definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "DT", page, title, ...) })
-
-setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "grViz"),
-          definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "DiagrammeR", page, title, ...) })
-
-setMethod("add_component",
-          signature = signature(dashboard = "i2dashboard", component = "gt_tbl"),
-          definition = function(dashboard, component, page = "default", title = NULL, ...) {
-            add_vis_object(dashboard, component, "gt", page, title, ...) })
+            # OTHER
+            warning("The component did not inherit from any of the currently supported classes ('htmlwidget').")
+            return(dashboard)
+            })
diff --git a/inst/templates/vis_object.Rmd b/inst/templates/vis_object.Rmd
index a43ef1c..88f0960 100644
--- a/inst/templates/vis_object.Rmd
+++ b/inst/templates/vis_object.Rmd
@@ -4,7 +4,7 @@
 
 ```{r}
 if (!requireNamespace("<% package %>", quietly = TRUE)) {
-    stop('The package <% package %> is needed to embed objects of class <% class %>.', call. = FALSE)
+    stop('The package "<% package %>" is needed to embed objects of class "<% class %>".', call. = FALSE)
 }
 
 vis_<% component_id %> <- readRDS(file.path(datadir, '<% component_id %>.rds'))
-- 
GitLab