diff --git a/.Rbuildignore b/.Rbuildignore index af3b398..a85dcc7 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,4 +1,5 @@ ..Rcheck +inst/doc/ ^.*\.Rproj$ ^\.Rproj\.user$ ^\.travis\.yml diff --git a/vignettes/.gitignore b/vignettes/.gitignore deleted file mode 100644 index 4b8356d..0000000 --- a/vignettes/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.html -*.R -archives/ diff --git a/vignettes/examples.Rmd b/vignettes/examples.Rmd deleted file mode 100644 index 4a9438c..0000000 --- a/vignettes/examples.Rmd +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Training datasets" ---- - -```{r, echo=FALSE} -htmltools::img(src = knitr::image_uri(file.path("../doc/img", "iconr_logo.png")), - alt = 'logo', width = '90', - style = 'position:absolute; top:0; right:0; padding:10px;') -``` - ---- - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -library(shiny) -library(iconr) -library(dplyr) -library(knitr) -library(kableExtra) - -downgit.root <- "https://downgit.github.io/#/home?url=" -gh.root <- paste0(downgit.root, "https://github.com/zoometh/iconr/") -dir.root <- paste0(gh.root, "tree/master/doc/datasets/") -url.df <- c(paste0(dir.root, "stele%20bas%20aragon"), - paste0(dir.root, "Valcamonica"), - paste0(dir.root, "Pena%20Tu")) -url.ref <- c("https://doi.org/10.3989/gladius.2013.0002", - "https://scholar.google.fr/scholar?hl=fr&as_sdt=0%2C5&q=Le+Pietre+degli+Dei%2C+menhir+e+stele+dell%27Eta+del+Rame+in+Valcamonica+e+Valtellina&btnG=", - "https://doi.org/10.1016/j.anthro.2005.09.009") -df.dset <- data.frame("download" = c("stele bas aragon", - "Valcamonica", - "Pena Tu"), - "name" = c("Estelas Ibericas con Lanzas", - "Ossimo", - "Peña Tu style"), - "nb.decor" = c("5", - "3", - "5"), - "description" = c("Iron Age stelae with ranges of spears, writings, etc.", - "Chalcolithic rock-art from Ossimo, Valcamonica", - "Bell-Beaker stelae and rock-art"), - "drawings.references" = c("Vargas 2013", - "Fedele 1994", - "Ramírez 2005"), - stringsAsFactors = F) -``` - - -These training datasets can be downloaded from the below dataframe. We also provide ready-to-use QGIS projects (.qgz) for each decoration: - -```{r, echo = F} -# row.names(df.dset) <- df.dset$family -df.dset %>% - mutate(download = cell_spec(download, "html", link = url.df)) %>% - mutate(drawings.references = cell_spec(drawings.references, "html", link = url.ref)) %>% - kable("html", escape = FALSE, row.names = F) %>% - kable_styling(bootstrap_options = c("hover", "condensed"), full_width = F) -``` diff --git a/vignettes/gis.Rmd b/vignettes/gis.Rmd deleted file mode 100644 index a8d19f1..0000000 --- a/vignettes/gis.Rmd +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: "GIS interface entry" -author: "Thomas Huet, Jose M Pozo, Craig Alexander" -bibliography: references.bib -output: - html_document: - toc: true - toc_float: - collapsed: false - smooth_scroll: false ---- - -```{r, echo=FALSE} -# print(getwd()) -# print(file.path("../logo", "iconr_logo.png")) -htmltools::img(src = knitr::image_uri(file.path("../doc/img", "iconr_logo.png")), -# htmltools::img(src = knitr::image_uri(file.path("img", "iconr_logo.png")), -# htmltools::img(src = knitr::image_uri(file.path(R.home("doc"), "html", "logo.jpg")), - alt = 'logo', width = '90', - style = 'position:absolute; top:0; right:0; padding:10px;') -``` - ---- - - - - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -library(knitr) -library(kableExtra) -library(dplyr) - -solanas.vor.path <- "../doc/img/all_process.gif" -``` - - -Any iconographic contents can be modeled with a geometric graph where nodes, also called **graphical units (GUs)**, linked together with edges and then analyzed with the **Graph Theory** and spatial analysis at the support scale. - -# Forewords - -The ***iconr*** R package grounds concepts and provides normalized tools to manage iconographic contents. This modeling is particularly interesting for compositions coming from Paleolithic, Neolithic and Protohistoric times [@Alexander08; @HuetAlexander15; @Huet18a]. To record large series of iconographic contents, the [GIS interface](#gis) appears to be the most appropriate one for users. This demo explains how to construct the graph _before_ using the package, offering also tipping points to facilitate the recording process. - -
- -![GIS view. A Late Bronze Age stelae (Solana de Cabañas, Cáceres, Spain).Stelae photograph (photograph credits: Museo Arqueológico Nacional, Madrid); Georeferencing of the steale drawing over its photograph (drawing credits: Diaz-Guardamino 2010); Binarization and polygonization/vectorization of the graphical content (graphical units, GUs) of the stelae (now `POLYGONS`); Calcul of their centroid (red points); Calcul of their Voronoi cells; Binary topological relationships (*birel*) for each pairwise of Voronoi cells: the ones that share a border (*touches* = TRUE) will share a link (ie, edge, in red) between their centroids (ie, nodes); Identification of the different types (nodes' column `type`)](`r solanas.vor.path`) - -
- - -# A GIS ? Yes but why ? {#gis} - -The *tenet* of the ***iconr*** is to always keep the user connected with the iconographic content -- his primary data source -- and emphasize the significance of the spatial dimension for any graphical content. Geographical Information Systems (GIS) offer multiple tools and options to facilitate the data entry. Use of GIS offers a graphic interface and ensures the correctness of spatial relationships between GUs. It forms a permanent interface between the image of he decoration and the database. Obviously, the main GIS facility is the presence of **attributes tables** which allow to record, filter and sort GUs on many information: types, techniques, orientations, lengths, etc. - -The other most important GIS facilities for the recording process are: - -* edition tools - + snapping tools - -* scale tools (see [Absolute scale](#scale.abs)) - + measurement tools - + georeferencing tools - -From far, our software preference goes to [QGIS](https://www.qgis.org/fr/site/), because it is open source, offers a large rank of database connections facilities (with PostGRES/GIS for example), has a large user community, but also because the source file is a XML (.qgs, .qgz) structure that can be parsed, modified, copied and moved with scripting languages like R and Python - -# Always start with an **image** - -The image will be the reference space of the graph. So, before anything, start by opening the image decoration into the GIS. In this tutorial we will take the example of the South Western Iberian **Abela stela** dated to the Middle Bronze Age. The original drawing can be download [here](https://github.com/zoometh/iconr/blob/master/docs/tutorial/img/Abela.jpg) [@DiazGuardamino10] - - -
- -![Drag and drop the decoration image before anything](../doc/img/gis_openImageGIS.gif){width=70%} -
- - -## Scales - -Use of GIS easy the scaling process. The creation of a spatialized graph permit to combine network analysis with spatial analysis of the graphical content - -### Relative scale {#scale.rel} - -The image extent is measured in pixels with a top-left corner origin (0,0). The coordinates system is irrelevant: image, nodes and edges are measured on the pixel grid - - -
- -![Coordinates system in pixels](../doc/img/gis_coordsQGIS.gif){width=70%} -
- -### Absolute scale {#scale.abs} - -To retrieve to true scale of the decoration, one can create a scale bar and apply a simple rule of three to convert pixels into centimeters, or meters. For example, if the scale belongs to another drawing, you can import it and 'georeferenced' it on the original drawing with the [*Freehand raster georeferencer* plugin](https://gvellut.github.io/FreehandRasterGeoreferencer/), and then create the scale bar - -
- -![Importing information on the scale and creation of a scale bar](../doc/img/gis_scaleAll.gif){width=70%} - -
- -Parallely, the dimensions of each GU can be measured with the QGIS **Measure Line** tool. At first, only the maximum length of the GU is important. It has also to be noted that if a Polygonization is done on the GUs, the maximum length -- between all other type of shape analysis indexes -- do not have to be calculated - -
- -![Measure and record the dimensions of each GUs in pixels](../doc/img/gis_scaleRuleOfThree.gif){width=70%} - -
- -To retrieve the real dimensions of each GUs, first get the pixel sizes with the Measure line tools, then apply a simple rule of three with: - -1. the size of the scale in pixels (native QGIS function `$length`) -2. the real size of the scale in cm (here, 100 cm) -3. the size of each GUs in cm - - -# **Nodes** and **edges** tables - -[Nodes](#nodes) and [edges](#edges) are the graph elements. At first, we have to create attribute tables for each of them. For example the nodes shapefiles: - - -
- -![Create the **nodes** shapefile with its attribute table](../doc/img/gis_createNodes.gif){width=70%} - -
- -In the GIS, [add a node](#graph.enodes.add) for each GUs and [add an edge](#graph.edges.add) between two contiguous GUs. Always start with the nodes - -## Nodes {#nodes} - -**Nodes** represent the basic information of the graphical content. For example, it would be easy to distinguish a decoration with aurochs (`type = auroch`) from a decoration with swords (`type = sword`). The former iconographic content should be probably related to the Late Paleolithic/Early Neolithic while the second one is more probably related to a period starting with the Bronze Age. Nodes are created as a shapefile of `POINTS`. The attribute table of the nodes has at least four (4) fields: - -1. `site` (Text): name of the site -2. `decor` (Text): name of the decoration -3. `id` (Integer): node identifier -4. `type`(Text): one of the relevant characteristics of each node - -The nodes are created near the centroids of each different graphical units (GUs). - -
- -![Adding **nodes** for each GU](../doc/img/gis_addNodes.gif){width=70%} - -
- -In this example, beside the *main* nodes sword (`epee`), anciform (`anciforme`) and halberd (`hallebarde`), we can also observe that the sword is connected to a belt and the anciform is worn as necklace. We probably would like to register this piece of graphical content as we also probably would like to characterize the types of blades for the sword and halberd, point out the presence of rivets on the sword depiction, etc. To do so, create 'Attribute edges' (`-+-`) - -## Edges {#edges} - -**Edges** types (field `type`) give information on nodes relative locations and on the nature of these nodes (main node *vs* attribute node, overlapping *vs* overlapped node, etc.). Edges are created as a shapefile of `LINES`. Edges attribute table has at least five (5) fields: - -1. `site` (Text): name of the site -2. `decor` (Text): name of the decoration -3. `a` (Integer): *starting* node -4. `b` (Integer) *ending* node -5. `type` (Text): values `=`, `+` or `>`; textual notation `-=-`, `-+-` or `->-` - -Theoretically, between two *main* nodes, edges exist when their Voronoi cells are contiguous. In practice, if you consider that two GUs are neighbors, you can create an edge between their two nodes: GIS snapping tool help ! - -
- -![Adding edges between contiguous GU](../doc/img/gis_addEdges.gif){width=70%} - -
- - -## Summary - -For the Abela decoration, we have created three (3) nodes (`1`,`2`,`3`) and two (2) *normal* edges (`1-=-2`,`1-=-2`). We named the nodes shapefile `nodes.shp` and the edges shapefile `edges.shp` because this is their default name in the ***incor*** package - -
- -![](../doc/img/gis_inputSummary.gif){width=70%} - -
- -# The **table of decorations** - -The **table of decorations** is a correspondence table which records joins between nodes and edges dataframes. In the package, the default name of this table is `imgs.tsv`, a tabulate separated-values (but it also can be a`.csv`, comma separated-values) - -
- -![](../doc/img/gis_createTableOfDecorations.gif){width=70%} - -
- -The **table of decorations** has four (4) mandatory fields: - -1. `idf` (Integer): short name of the decoration -1. `site` (Text): name of the site -2. `decor` (Text): name of the decoration -4. `img` (Text): name of the drawing/photograph/... - - -# References - diff --git a/vignettes/next.Rmd b/vignettes/next.Rmd deleted file mode 100644 index 5dbdc2a..0000000 --- a/vignettes/next.Rmd +++ /dev/null @@ -1,267 +0,0 @@ ---- -title: "Next developments" -author: "Thomas Huet, Jose M Pozo, Craig Alexander" -bibliography: references.bib -output: - html_document: - toc: true - toc_float: - collapsed: false - smooth_scroll: false ---- - -```{r, echo=FALSE} -# print(getwd()) -# print(file.path("../logo", "iconr_logo.png")) -htmltools::img(src = knitr::image_uri(file.path("../doc/img", "iconr_logo.png")), -# htmltools::img(src = knitr::image_uri(file.path("img", "iconr_logo.png")), -# htmltools::img(src = knitr::image_uri(file.path(R.home("doc"), "html", "logo.jpg")), - alt = 'logo', width = '90', - style = 'position:absolute; top:0; right:0; padding:10px;') -``` - - - - - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -library(knitr) -library(kableExtra) -library(dplyr) -library(igraph) -library(iconr) -# library(ggdag) -library(tidygraph) -library(ggraph) -library(png) -library(grid) -library(gridExtra) -library(stratigraphr) - -ibahernando.path <- "../doc/img/ibahernando_256colours.png" -brozas.path <- "../doc/img/brozas_256colours.png" -dummies.path <- "../doc/img/dummies.png" -ibahernando <- rasterGrob(as.raster(readPNG(ibahernando.path)), interpolate = FALSE) -``` - -***iconr*** package is hope to lay the foundation of further developments - -# Multifactorial analysis - -In those examples, the study and comparisons have been made on the basis of different types of GUs with the variable `type` (`nd.var = "type"`). However, if a new column is added to the node dataframe or shapefile, the study can also incorporate other variables. Fox example, one of these new variable could be the technique by which the GU was created (`nd.var = "technique"`): - -
- -![GIS view. The Brozas stelae (decoration 1) with the different engraving techniques: `g_piq` (peckings) for the spear, the shield and the sword; `g_inc` (incisions) for the the fibula and the comb](`r brozas.path`){width=400px} - -
- -# Shape analysis - -When the decoration iconographical content is composed by GUs separated one with another with neutral background, is could be easy to binarize and polygonize them (black GUs on white background). GUs can also be binarized/polygonized separately and reintegrated to the GIS interface - -
- -![GIS view. Graph decoration with shape analysis indexes (ConveHull, Minimum Bound Rectangle, Minimum Bound Circle)](`r dummies.path`){width=500px} - -
- ---- - -Shape analysis allows to calculate numerous indexes (e.g., convexhull, MBR, MBC, Feret diameter) and/or contour comparisons (e.g., Procrustes analysis) that can be used in multivariate analysis to quantify the (dis)similarities between GUs - ---- - -# Typology - -Graph theory and structured vocabularies allows one to construct tree structures for categorical variables (e.g., the different types of GUs). These structures allow generalization processes (upward to the parent level) and specification processes (downward to the child level). For example, a `sword` and a `spear` belong both to the `weapons` group (sub-group `offensive weapons`), a `shield` belongs to the `weapons` group (sub-group `defensive weapons`), etc.: - -```{r hierac, warning=FALSE, fig.width=7, fig.height=4, asp=0} -oldpar <- par(no.readonly = TRUE) -on.exit(par(oldpar)) -par(mar=c(0, 0, 0, 0)) -g <- graph_from_literal(objects-+weapons, - objects-+personnal_item, - weapons-+offensive_weapons, - weapons-+defensive_weapons, - offensive_weapons-+spear, - offensive_weapons-+sword, - defensive_weapons-+shield, - defensive_weapons-+helmet, - personnal_item-+miror, - personnal_item-+comb) -layout <- layout.reingold.tilford(g) -plot(g, - layout = layout, - vertex.color = "white", - vertex.frame.color = "white", - vertex.size = 20, - vertex.label.cex = 0.7, - vertex.label.color = "black", - vertex.label.family = "sans", - edge.arrow.size = 0.5 - ) -``` - -Such a formalism can be used to weight the differences between nodes, to conduct analysis with different levels of precision or to overcome issues of idiosyncratic typologies. - ---- - -A major issue will be to manage multi-linguism shared vocabularies to describe the iconographic content, the techniques used, etc. - ---- - -# Harris matrix - -Using the *diachronic* edge notation, layered directed acyclic graphs (DAG) -- like the Harris matrix relative chronology diagrams -- can also be used to construct. For example, with the Ibahernando stelae (decoration 5) - -```{r overlap, echo=FALSE, warning=FALSE, out.width="100%"} -# library(data.tree) -# -# imgs <- read.table(system.file("extdata", "imgs.csv", package = "iconr"), -# sep=";", stringsAsFactors = FALSE) -# nodes <- read.table(system.file("extdata", "nodes.csv", package = "iconr"), -# sep=";", stringsAsFactors = FALSE) -# edges <- read.table(system.file("extdata", "edges.csv", package = "iconr"), -# sep=";", stringsAsFactors = FALSE) -# lgrph <- list_dec(imgs, nodes, edges) -# edges.iba <- igraph::as_data_frame(lgrph[[5]], what="edges") -# overlap.nodes <- unique(edges.iba[edges.iba$type == ">", "from"]) -# contemp.nodes <- unique(unlist(edges.iba[edges.iba$type == "=", c("from", "to")])) -# df.stratig <- data.frame(over = rep(overlap.nodes, length(contemp.nodes)), -# under = contemp.nodes) -# df.stratig$pathString <- paste(lgrph[[5]]$decor, -# df.stratig$over, -# df.stratig$under, -# sep = "/") -# # superpo <- as.Node(df.stratig) -# # print(superpo) -# gd <- graph_from_data_frame(df.stratig, directed = TRUE, vertices = NULL) -# gd.ed <- as_data_frame(gd, what="edges") -# gd.nd <- as_data_frame(gd, what="vertices") -# rstat_nodes <- data.frame(name = gd.nd) -# rstat_edges <- data.frame(from = gd.ed$from, -# to = gd.ed$to) -# # rstat_nodes <- data.frame(name = c("Hadley", "David", "Romain", "Julia")) -# # rstat_edges <- data.frame(from = c(1, 1, 1, 2, 3, 3, 4, 4, 4), -# # to = c(2, 3, 4, 1, 1, 2, 1, 2, 3)) -# gd.all <- tbl_graph(nodes = rstat_nodes, edges = rstat_edges) -# gd.all <- set.vertex.attribute(gd.all, "context", value=as.character(V(gd.all))) -imgs <- read.table(system.file("extdata", "imgs.csv", package = "iconr"), - sep=";", stringsAsFactors = FALSE) -nodes <- read.table(system.file("extdata", "nodes.csv", package = "iconr"), - sep=";", stringsAsFactors = FALSE) -edges <- read.table(system.file("extdata", "edges.csv", package = "iconr"), - sep=";", stringsAsFactors = FALSE) -lgrph <- list_dec(imgs, nodes, edges) -# edges -edges.iba <- igraph::as_data_frame(lgrph[[5]], what="edges") -over.edges <- edges.iba[edges.iba[, "type"] == ">", ] -contemp.edges <- edges.iba[edges.iba[, "type"] == "=", ] -# nodes -nodes.iba <- igraph::as_data_frame(lgrph[[5]], what="vertices") -tib.gd.nd <- as_tibble(nodes.iba) # convert nodes df to tibble -tib.gd.nd$context <- tib.gd.nd$name # the "context" -# prepare the df -tib.gd.nd$above <- tib.gd.nd$below <- tib.gd.nd$equal <- NA -class(tib.gd.nd$above) <- class(tib.gd.nd$below) <- class(tib.gd.nd$equal) <- "list" # change class -tib.gd.nd$name <- tib.gd.nd$x <- tib.gd.nd$y <- tib.gd.nd$type <- NULL -# OVER -for(n in tib.gd.nd$context){ - # filter for each nodes - n.is.above <- over.edges[over.edges[, "from"] == n, ] - if (nrow(n.is.above) > 0){ - tib.gd.nd[n , "below"][[1]] <- list(n.is.above[, "to"]) - } - n.is.below <- over.edges[over.edges[, "to"] == n, ] - if (nrow(n.is.below) > 0){ - tib.gd.nd[n , "above"][[1]] <- list(n.is.below[, "from"]) - } - n.is.contemp <- contemp.edges[contemp.edges[, "from"] == n, ] - if (nrow(n.is.contemp) > 0){ - tib.gd.nd[n , "equal"][[1]] <- list(n.is.contemp[, "to"]) - } -} - -## see equal nodes -# equals are listed in "equals" and "context" -eqs <- tib.gd.nd[as.vector(!is.na(tib.gd.nd[, "equal"])), ] -# /!\ what if different layers ? -nds.equals <- unlist(unique(c(eqs$context, eqs$equal))) -get.eq <- get.bl <- get.ab <- list() -# df <- tib.gd.nd -for (n in nds.equals){ - # n <- 2 - # get - other.equal <- nds.equals[nds.equals != n] - tib.gd.nd[n, "equal"][[1]] <- list(other.equal) -} -## merge values for equal nodes -# see above for equal nodes -ab <- unique(as.vector(unlist(tib.gd.nd[nds.equals, "above"]))) -ab <- ab[!is.na(ab)] -if(is.logical(ab)) ab <- NA -tib.gd.nd[nds.equals, "above"][[1]] <- list(ab) -# see below for equal nodes -bl <- unique(as.vector(unlist(tib.gd.nd[nds.equals, "below"]))) -bl <- bl[!is.na(bl)] -# avoid logical(0) -if(is.logical(bl)) bl <- NA -tib.gd.nd[nds.equals, "below"][[1]] <- list(bl) -## merge for overlap nodes (non equal) -for(i in nrow(tib.gd.nd)){ - # i <- 1 - ov <- unique(as.vector(unlist(tib.gd.nd[i, "below"]))) - node.to.add <- setdiff(nds.equals, ov) - is.above <- unique(as.vector(unlist(tib.gd.nd[node.to.add, "above"]))) -} -# -all.above <- as.vector(unlist(tib.gd.nd[, "above"])) -for(i in seq(1, length(all.above))){ - # i <- 2 - # ctx <- all.above[i] - context <- as.vector(unlist(tib.gd.nd[i, "context"])) - # find the nodes where the context is above - abv <- as.character(which(all.above %in% context)) - # avoid character(0) - abv[length(abv) == 0] <- NA - tib.gd.nd[i, "below"][[1]] <- list(abv) -} -# add "natural" at the bottom -tib.gd.nd[nrow(tib.gd.nd)+1, "context"] <- "natural" -# select nodes without any nodes below them -down.nodes <- as.vector(unlist(tib.gd.nd[is.na(tib.gd.nd[, "below"]), "context"])) -# the down.nodes are upper the "natural" -tib.gd.nd[nrow(tib.gd.nd), "above"][[1]] <- list(down.nodes) -# add "natural" below the down.nodes -tib.gd.nd[down.nodes, "below"][[1]] <- list("natural") -# - - - - - - - - - - - - - - -# gd.all <- tbl_graph(nodes = tib.gd.nd, edges = edges.iba) -h12_graph <- stratigraph(tib.gd.nd, "context", "above") # works harris12, ~ with 'gd.all' -# ggraph(h12_graph, layout = "sugiyama") + -# geom_edge_elbow() + -# geom_node_label(aes(label = context), label.r = unit(0, "mm")) + -# theme_graph() -a.g <- ggraph(h12_graph, layout = "sugiyama") + - geom_edge_elbow() + - geom_node_label(aes(label = context), label.r = unit(0, "mm")) + - theme_graph() -# knitr::include_graphics(c("path/to/img1","path/to/img1")) -grid.arrange(ibahernando, a.g, ncol = 2) -``` - ---- - -DAG is a common graphical formalism to represent chronological ordering such as Bayesian, radiocarbon and age-depth models (e.g., [RChronoModel](https://cran.r-project.org/web/packages/RChronoModel/index.html), [stratigraphr](https://stratigraphr.joeroe.io/articles/stratigraph.html)). DAGs can also be used for cultural period sequences like GUs chrono-cultural attribution (e.g., "Late Bronze Age", "Iron Age", "Roman Times") - ---- diff --git a/vignettes/shiny.Rmd b/vignettes/shiny.Rmd deleted file mode 100644 index 450c7c2..0000000 --- a/vignettes/shiny.Rmd +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: "Interactive examples on training datasets" ---- - -```{r, echo=FALSE} -# print(getwd()) -# print(file.path("../logo", "iconr_logo.png")) -htmltools::img(src = knitr::image_uri(file.path("../doc/img", "iconr_logo.png")), - # htmltools::img(src = knitr::image_uri(file.path("img", "iconr_logo.png")), - # htmltools::img(src = knitr::image_uri(file.path(R.home("doc"), "html", "logo.jpg")), - alt = 'logo', width = '90', - style = 'position:absolute; top:0; right:0; padding:10px;') -# setwd("C:/Users/supernova/Dropbox/My PC (supernova-pc)/Documents/iconr/doc/datasets") -``` - - - -
-

This RShiny app show examples on how to record the GUs and their proximity links with the iconr package -plot_dec() function

-
- -
- -