
<%
db = load_pkg_db(online = FALSE)
date = attr(db, ".version")
bioc_version = ALL_BIOC_RELEASES$Release[ALL_BIOC_RELEASES$Date == date]
bioc_url = ALL_BIOC_RELEASES$URL[ALL_BIOC_RELEASES$Date == date]

n_cran = sum(grepl("(bioc|books|annotation|experiment|workflows)/src/contrib$", db$meta$Repository))
n_bioc = sum(grepl("src/contrib$", db$meta$Repository)) - n_cran

if(n_cran == 0 && n_bioc == 0) {
	n_cran = sum(db$meta$Repository == "CRAN")
	n_bioc = sum(db$meta$Repository == "Bioconductor")
}
%>

<h2>Dependency heaviness analysis on all R packages</h2>
<p>The snapshot of the CRAN/Biocoductor ecosystem was captured on <b><%=date%></b>. There are
<b><%=n_cran%></b> packages from CRAN and <b><%=n_bioc%></b> packages from
Bioconductor (<a href='<%=bioc_url%>' target='_blank'>bioc version <%=bioc_version%></a>).</p>

<div id="tabs">
  <ul>
    <li><a href="#table">Heaviness table</a></li>
    <li><a href="#metrics">Heaviness metrics</a></li>
    <li><a href="#analysis">Heaviness analysis</a></li>
    <li><a href="#timeline">Timeline</a></li>
    <li><a href="#datasets">Datasets</a></li>
      </ul>

<div id="table"> 
<style>
details summary {
    cursor: pointer;
}
summary {
    display: list-item;
}
details > summary:first-of-type {
    display: list-item;
    counter-increment: list-item 0;
    list-style: inside disclosure-closed;
}
details[open] > summary:first-of-type {
    list-style-type: disclosure-open;
}
</style>


<div class="form-box">
<form method="get" class="form-inline">

<div>
	<label> <b>Order table rows by: </b> <a id="order-by-note" class="fake-link" title="Adjusted heaviness is used to prioritize packages with high heaviness values but also affecting or being affected by a larger number of packgaes. The values themselves are not listed in the table because they are meaningless. They are only used for reordering the table." style="font-size: 0.8em;">Where are these columns?</a><br>
		<input type="radio" name="order_by" value="adjusted_max_heaviness_from_parents" <%=ifelse(order_by == 'adjusted_max_heaviness_from_parents', 'checked=1', '')%> onchange="this.form.submit()"> Adjusted max heaviness from parent packages
      <input type="radio" name="order_by" value="adjusted_heaviness_on_children" <%=ifelse(order_by == 'adjusted_heaviness_on_children', 'checked=1', '')%> onchange="this.form.submit()"> Adjusted heaviness on child packages
      <% if(exclude_children) { %>
      <input type="radio" name="order_by" value="adjusted_heaviness_on_indirect_downstream" <%=ifelse(order_by == 'adjusted_heaviness_on_indirect_downstream', 'checked=1', '')%> onchange="this.form.submit()"> Adjusted heaviness on downstream packages (excluding child packages)
      <% } else { %>
      <input type="radio" name="order_by" value="adjusted_heaviness_on_downstream" <%=ifelse(order_by == 'adjusted_heaviness_on_downstream', 'checked=1', '')%>onchange="this.form.submit()"> Adjusted heaviness on downstream packages
      <% } %>
        </label>
</div>
<br>

<div>
  <label> <b>Other settings: </b><br>
    <input id="input-reducible" type="checkbox" name="reducible" <%=ifelse(only_reducible, 'checked=1', '')%> onchange="this.form.submit()"> Only show packages whose parent's heaviness could be reduced, <i>i.e.</i>, only a limited number of functions are imported from the heaviest parent.
  </label>
</div>

<div>
<label>
	<input id="input-exclude-children" type="checkbox" name="exclude_children" <%=ifelse(exclude_children, 'checked=1', '')%> onchange="this.form.submit()"> Exclude children from downstream packages or only list indirect downsteam packages. A package's downstream packages also include its child packages, so a package's heaviness on downstream packages would be very similar to the heaviness on its child packages if the dependency depth to downstream is small (if the max dependency depth is 1, then all downstream packages are child packages). Thus, excluding children from downstream packages helps to discover the heaviness that indirectly affects downstream packages.
</label>
</div>


<script>
$(function() {
  $("#order-by-note").tooltip();
});
</script>

 </form>
<p><b>Legends:</b></p>
<p><span class="heaviness-high"><a>High heaviness</a></span> Packages with adjusted heaviness on child packages higher than <%=CUTOFF$adjusted_heaviness_on_children%>.</p>
<p><span class="reducible" style="font-size:1em;">reducible</span> Packages whose parent's heaviness could be reduced, i.e. only a limited number of functions are imported from the heaviest parent.</p>
<p><b>Columns:</b>
 <span style="width:20px;background-color:#FFFF10;padding:0px 4px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;Heaviness from parent packages
 <span style="width:20px;background-color:#10FFFF;padding:0px 4px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;Heaviness on child/downstream packages
 </p>
 <br>
<p>The full table of dependency heaviness analysis can be obtained by:<p>

<pre class="code">
library(pkgndep)
pkgndep_opt$heaviness_db_version = "<%=pkgndep_opt$heaviness_db_version%>"
df = all_pkg_stat_snapshot()</pre>
</div>

<% reducible_str = ifelse(only_reducible, 'on', '') 
	 exclude_children_str = ifelse(exclude_children, 'on', '') 
if(exclude_children) {
	col.names = c(qq("<a href='?order_by=package&reducible=@{reducible_str}'>Package</a>"), 
			             "Repository",
				          qq("<a href='?order_by=n_by_strong&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of strong dependency packages</a>"), 
				          qq("<a href='?order_by=n_by_all&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of all dependency packages</a>"), 
				          qq("<a href='?order_by=n_parents&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of parent packages</a>"), 
				          qq("<a href='?order_by=max_heaviness_from_parents&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Max heaviness from parent packages</a>"), 
				          qq("<a href='?order_by=max_co_heaviness_from_parents&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Max co-heaviness from parent packages</a>"), 
				          qq("<a href='?order_by=heaviness_on_children&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Heaviness on child packages</a>"), 
				          qq("<a href='?order_by=n_children&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of child packages</a>"), 
				          qq("<a href='?order_by=adjusted_heaviness_on_indirect_downstream&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Heaviness on indirect downstream packages (excluding children)</a>"), 
				          qq("<a href='?order_by=n_indirect_downstream&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of indirect downstream packages (excluding children)</a>"))
} else {
	col.names = c(qq("<a href='?order_by=package&reducible=@{reducible_str}'>Package</a>"), 
			             "Repository",
				          qq("<a href='?order_by=n_by_strong&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of strong dependency packages</a>"), 
				          qq("<a href='?order_by=n_by_all&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of all dependency packages</a>"), 
				          qq("<a href='?order_by=n_parents&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of parent packages</a>"), 
				          qq("<a href='?order_by=max_heaviness_from_parents&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Max heaviness from parent packages</a>"), 
				          qq("<a href='?order_by=max_co_heaviness_from_parents&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Max co-heaviness from parent packages</a>"), 
				          qq("<a href='?order_by=heaviness_on_children&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Heaviness on child packages</a>"), 
				          qq("<a href='?order_by=n_children&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of child packages</a>"), 
				          qq("<a href='?order_by=heaviness_on_downstream&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Heaviness on downstream packages</a>"), 
				          qq("<a href='?order_by=n_downstream&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}'>Number of downstream packages</a>"))
}
%>

<%= as.character(knitr::kable(df2, format = "html", row.names = FALSE, escape = FALSE, table.attr = "id='dependency-table' class='table table-striped'",
			col.names = col.names,
			align = c("l", rep("r", ncol(df2) - 1)))) %>
<style>
.heaviness-high {
	padding: 2px 4px;
	background-color: red;
	border-radius:  4px;
}

.heaviness-high a {
	color: white;
}

.heaviness-median {
	padding: 2px 4px;
	background-color: orange;
	border-radius:  4px;
}

.heaviness-median a {
	color: white;
}

.reducible {
	padding: 2px 4px;
	background-color: purple;
	border-radius:  4px;
	color:  white;
	font-size: 10px;
	vertical-align: middle;
}

.reducible a {
	color: white;
}

</style>
<script>
$(function() {
	$("#dependency-table thead th").filter( ":nth-child(3)" ).css("background-color", "#FFFF10");
	$("#dependency-table thead th").filter( ":nth-child(4)" ).css("background-color", "#FFFF10");
	$("#dependency-table thead th").filter( ":nth-child(5)" ).css("background-color", "#FFFF10");
	$("#dependency-table thead th").filter( ":nth-child(6)" ).css("background-color", "#FFFF10");
	$("#dependency-table thead th").filter( ":nth-child(7)" ).css("background-color", "#FFFF10");

	$("#dependency-table thead th").filter( ":nth-child(8)" ).css("background-color", "#10FFFF");
	$("#dependency-table thead th").filter( ":nth-child(9)" ).css("background-color", "#10FFFF");
	$("#dependency-table thead th").filter( ":nth-child(10)" ).css("background-color", "#10FFFF");
	$("#dependency-table thead th").filter( ":nth-child(11)" ).css("background-color", "#10FFFF");

	$("#dependency-table a").tooltip();
})
</script>

<% if(package == "") { %>

<% if(order_by == "adjusted_heaviness_on_children") order_by = "" %>

<div>
<form method="get" class="form-inline">
<select id="records_per_page" class="form-control" aria-label="Records per page" name="records_per_page">
  <option value="20" <%= ifelse(records_per_page == 20, 'selected', '') %>>20</option>
  <option value="50" <%= ifelse(records_per_page == 50, 'selected', '') %>>50</option>
  <option value="100" <%= ifelse(records_per_page == 100, 'selected', '') %>>100</option>
</select> records per page, showing <%=ind[1]%> to <%=ind[length(ind)]%> of <%=nrow(df)%> pacakges.
<input type="hidden" name="order_by" value="<%=order_by%>" />
<input type="hidden" name="reducible" value="<%=reducible_str%>" />
<input type="hidden" name="exclude_children" value="<%=exclude_children_str%>" />
</form>

 <script type="text/javascript">

  $(function() {
    $('#records_per_page').change(function() {
        this.form.submit();
    });
});
</script>

</div>



	<% nr = nrow(df)
	if(nr > records_per_page) { %>
		<%= page_select(page, ceiling(nr/records_per_page), qq("order_by=@{order_by}&reducible=@{reducible_str}&exclude_children=@{exclude_children_str}")) %>
	<% } %>

<% } %>

</div>



<div id="metrics">

<div id="metrics-content">

<h3>Dependency categories</h3>

For a package denoted as <i>P</i>, its direct
dependency packages are listed in the <code>Depends</code>,
<code>Imports</code>, <code>LinkingTo</code>, <code>Suggestes</code> and
<code>Enhances</code> fields in its <code>DESCRIPTION</code> file. We define the following dependency categories
for package <i>P</i>:</p>

<ul>
<li><b>Strong parent packages:</b> Dependency packages listed in the <code>Depends</code>, <code>Imports</code>, and <code>LinkingTo</code> of <i>P</i> (red box in the figure). They are also called the <b>strong direct dependency packages</b> of <i>P</i>. Strong parent packages are mandatory to be installed when installing <i>P</i>.</li>

<li><b>Weak parent packages:</b> Dependency packages listed in the <code>Suggest</code> and <code>Enhances</code> of <i>P</i> (green box in the figure). They are optionally required when installing <i>P</i>.</li>

<li><b>Strong dependency packages:</b> Total dependency packages by recursively looking for parent packages (category A, B, as well as the packages in red box in the figure). They are also called the <b>upstream packages</b>. Note strong dependency packages include parent packages. Strong dependency packages are mandatory to be installed when installing <i>P</i>.</li>

<li><b>All dependency packages:</b> Total dependencies by recursively looking for parent packages, but on the level of <i>P</i>, its weak parents are also included (package category A, B, C and D, plus all packages listed in the red and green boxes in the figure). It simulates when the full functionality of <i>P</i> is required, or all weak parents become strong parents, the total number of strong dependency packages <i>P</i> requires.</li>

<li><b>Child packages:</b> Packages whose parents include <i>P</i> (category E in the figure). They are the packages on which <i>P</i> has a direct impact of dependencies.</li>

<li><b>Downstream packages:</b> Total packages by recursively looking for child packages (category E and F in the figure). <i>P</i> is required for the installation of any of its downstream packages. Note downstream packages include child packages.</li>

<li><b>Indirect downstream packages:</b> Downstream packages excluding child packages (category F in the figure), <i>i.e.</i>, these with distance to <i>P</i> of at least 2 in the global dependency graph. These are the packages on which <i>P</i> has an indirect influence of dependencies.</li>

</ul>

<div style="padding:20px 206px;">
<%= paste(readLines(system.file("website", "dependency_diagram.svg", package = "pkgndep")), collapse = "\n") %>
</div>

<h3>Heaviness metrics</h3>

<p>Various metrics for the heaviness are defined as follows:</p>

<ul> 
	<li><b>Heaviness from a parent.</b> If package <i>A</i> is a strong parent of <i>P</i>, the heaviness of <i>A</i> on <i>P</i> denoted as $h$ is calculated as $h = n_1 - n_2$ where $n_1$ is the number of strong dependencies of <i>P</i>, and $n_2$ is the number of strong dependencies of <i>P</i> after changing <i>A</i> from a strong parent to a weak parent, <i>i.e.</i>, by moving <i>A</i> to <code>Suggests</code> of <i>P</i>. Thus, the heaviness measures the number of additionally required strong dependencies that <i>A</i> brings to <i>P</i> and they are not brought by any other parent. 
If package <i>B</i> is a weak parent of <i>P</i>, $n_2$ is defined as the number of strong dependencies of <i>P</i> after changing <i>B</i> to a strong parent of <i>P</i>, <i>i.e.</i>, by moving <i>B</i> to <code>Imports</code> of <i>P</i>. In this scenario, the heaviness of the weak parent is calculated as $n_2 - n_1$.</li>

<li><b>Max heaviness from parents.</b> Assume package <i>P</i> has $K_\mathrm{p}$ parents, the heaviness denoted as $h_\mathrm{max}$ is defined as $h_\mathrm{max}=\underset{k\in\{1..K_\mathrm{p}\}}{\max}h_{k}$ where $h_k$ is the heaviness of the k<sup>th</sup> parent on <i>P</i>.
</li>

<li><b>Heaviness on the child packages.</b> Assume <i>P</i> has $K_\mathrm{c}$ child packages and the k<sup>th</sup> child is denoted as <i>A<sub>k</sub></i>. Denote the number of strong dependencies of <i>A<sub>k</sub></i> as $n_{1k}$, and denote the number of strong dependencies of <i>A<sub>k</sub></i> after changing <i>P</i> as a weak parent of <i>A<sub>k</sub></i> as $n_{2k}$, the heaviness of <i>P</i> on its child packages denoted as $h_\mathrm{c}$ is calculated as $h_\mathrm{c}=\frac{1}{K_\mathrm{c}}\sum_{k=1}^{K_\mathrm{c}}(n_{1k}-n_{2k})$.
The heaviness measures the average number of additional dependencies that <i>P</i> brings to its child packages.</li>

<li><b>Heaviness on the downstream packages.</b> The definition is similar to the heaviness on the child packages. Assume <i>P</i> has $K_\mathrm{d}$ downstream packages and the k<sup>th</sup> downstream package is denoted as <i>B<sub>k</sub></i>. Denote the number of strong dependencies of <i>B<sub>k</sub></i> as $n_{1k}$, and denote the number of strong parents of <i>B<sub>k</sub></i> after changing <i>P</i> to a weak parent of all <i>P</i>'s child packages as $n_{2k}$. The heaviness of <i>P</i> on its downstream packages denoted as $h_\mathrm{d}$ is calculated as $h_\mathrm{d}=\frac{1}{K_\mathrm{d}}\sum_{k=1}^{K_\mathrm{d}}(n_{1k}-n_{2k})$.</li>

<li><b>Heaviness on the indirect downstream packages.</b>The calculation is the same as $h_\mathrm{d}$ except here child packages are excluded from downstream packages. Denote the heaviness as $h_\mathrm{id}$ and denote the set of <i>P</i>'s child packages as $S_\mathrm{c}$, $h_\mathrm{id}$ is defined as $h_\mathrm{id}=\frac{1}{K_\mathrm{d}-K_\mathrm{c}}\sum_{k=1}^{K_\mathrm{d}}(n_{1k}-n_{2k})\cdot I(B_k\notin S_\mathrm{c})$,
where $K_\mathrm{c}$ and $K_\mathrm{d}$ are the numbers of child and downstream packages respectively, and $I()$ is an indicator function. $h_\mathrm{id}$ is set to 0 if $K_\mathrm{c} = K_\mathrm{d}$, <i>i.e.</i>, <i>P</i> has no indirect downstream packages. $h_\mathrm{id}$ measures the contribution of dependencies of <i>P</i> to the ecosystems in an indirect way.</li>

</ul>

<h3> Adjusted heaviness</h3>

<p>If grouping packages by $K$ which can be the number of parent, child or downstream packages depending on the type of the heaviness metrics, the distributions of heaviness values always have long tails, and the tails are especially longer for smaller $K$. Thus, if simply ranking packages based on the original heaviness values, top packages are preferably associated with small $K$. In general, packages with small $K$ are of less interest because they only have very small impacts to the ecosystem. To prioritize packages with broader impacts to the ecosystem, the original definitions of various heaviness metrics are adjusted to decrease the weights of packages with smaller $K$. Please note, the designs of the adjusted heaviness metrics are empirical and the absolute values of adjusted heaviness are meaningless, which are only used for ranking packages. 
A detailed explanation of various adjusted heaviness metrics can be found in the tab <b>"Heaviness analysis"</b>.</p>

<h3>Co-heaviness from parent pairs</h3>
<p>The co-heaviness measures the number of additional dependency packages simultaneously brought by two parent packages. Let <i>A</i> and <i>B</i> be two parents of <i>P</i>, denote $S_A$ as the set of reduced dependency packages when only changing <i>A</i> to a weak parent of <i>P</i>, denote $S_B$ as the set of reduced dependency packages when only changing <i>B</i> to a weak parent of <i>P</i>, and denote $S_{AB}$ as the set of reduced dependency packages when changing both <i>A</i> and <i>B</i> to weak parents of <i>P</i>, then the co-heaviness of <i>A</i> and <i>B</i> on <i>P</i> denoted as $h_{co}$ is defined as $h_{co} = \left|S_{AB}\setminus\cup(S_A,S_B)\right|$ where the symbol $X \setminus Y$ corresponds to the set of elements in $X$ but not in $Y$, and $|X|$ is the number of elements in set $X$. The co-heaviness measures the number of reduced packages only caused by co-action of <i>A</i> and <i>B</i>.
</p>



</div>
</div>


<div id="analysis">

<div id="analysis-content">
<p>Loading content...</p>
<div class='lds-ellipsis'><div></div><div></div><div></div><div></div></div>
<script>
$.ajax({
  url: "global_heaviness_analysis"
}).done(function(html) {
  $("#analysis-content").html(html);
});
</script>

</div>
</div>

<div id="timeline">

<div id="timeline-content">
<p>Loading content...</p>
<div class='lds-ellipsis'><div></div><div></div><div></div><div></div></div>
<script>
$.ajax({
  url: "timeline"
}).done(function(html) {
  $("#timeline-content").html(html);
});
</script>

</div>
</div>



<div id="datasets">
<p>Scripts for downloading and parsing all packages from CRAN and Bioconductor are available at <a href="https://github.com/jokergoo/R_evolution" target="_blank">https://github.com/jokergoo/R_evolution</a>. Scripts for building package databases and performing dependency heaviness analysis for all packages are available with the command <code>system.file("extdata", "analysis.R", package = "pkgndep")</code>.</p>

<h3>Datasets for specific versions</h3>
<details>
	<summary>File descriptions</summary>
	<ul>
		<li><code>all_pkgs_{bioc_version}.rds</code>: A list of objects from the dependency heaviness analysis on individual packages by the function <code>pkgndep()</code>.</li>
		<li><code>pkg_db_snapshot_{bioc_version}.rds</code>: A package database, in <code>pkg_db</code> class. Please go to <code>?reformat_db</code> to see all supported methods.</li>
		<li><code>all_pkg_stat_snapshot_{bioc_version}.rds</code>: A data frame of various metrics of packages.</li>
		<li><code>pkg_igraph_{bioc_version}.rds</code>: A <code>igraph</code> object of all strong dependency relations. Parent-child heaviness is the edge weight.</li>
		<li><code>pkg_df_{bioc_version}.rds</code>: A matrix in the same format as the one from <code>available.packages()</code>.</li>
		<li><code>pkg_description_{bioc_version}.rds</code>: A list of <code>DESCRIPTION</code> contents.</li>
		<li><code>pkg_namespace_{bioc_version}.rds</code>: A list of <code>NAMESPACE</code> contents.</li>
	</ul>
	</details>
<%
tb = ALL_BIOC_RELEASES[, c("Date", "Release", "R")]

tb[["f1"]] = qq("<a href='https://pkgndep.github.io/@{tb$Date}/all_pkgs_@{tb$Release}.rds'>all_pkgs_@{tb$Release}.rds</a>", collapse = FALSE)
tb[["f2"]] = qq("<a href='https://pkgndep.github.io/@{tb$Date}/pkg_db_snapshot_@{tb$Release}.rds'>pkg_db_snapshot_@{tb$Release}.rds</a>", collapse = FALSE)
tb[["f3"]] = qq("<a href='https://pkgndep.github.io/@{tb$Date}/all_pkg_stat_snapshot_@{tb$Release}.rds'>all_pkg_stat_snapshot_@{tb$Release}.rds</a>", collapse = FALSE)
tb[["f3.5"]] = qq("<a href='https://pkgndep.github.io/@{tb$Date}/pkg_igraph_@{tb$Release}.rds'>pkg_igraph_@{tb$Release}.rds</a>", collapse = FALSE)
tb[["f4"]] = qq("<a href='https://pkgndep.github.io/@{tb$Date}/pkg_df_@{tb$Release}.rds'>pkg_df_@{tb$Release}.rds</a>", collapse = FALSE)
tb[["f5"]] = qq("<a href='https://pkgndep.github.io/@{tb$Date}/pkg_description_@{tb$Release}.rds'>pkg_description_@{tb$Release}.rds</a>", collapse = FALSE)
tb[["f6"]] = qq("<a href='https://pkgndep.github.io/@{tb$Date}/pkg_namespace_@{tb$Release}.rds'>pkg_namespace_@{tb$Release}.rds</a>", collapse = FALSE)
tb[["Release"]] = qq("<a href='@{ALL_BIOC_RELEASES$URL}' target='_blank'>@{tb$Release}</a>", collapse = FALSE)
%>

<%=knitr::kable(tb, format = "html", escape = FALSE, row.names = FALSE, col.names = c("Date", "Bioc release", "R version", "", "", "", "", "", "", ""), table.attr = "class='table table-striped' style='font-size:0.9em'")%>

<h3>Datasets for all versions</h3>
<ul>
<li><a href="https://pkgndep.github.io/all_bioc_links.rds">all_bioc_links.rds</a>: URL of Bioconductor packages.</li>
<li><a href="https://pkgndep.github.io/all_packages_dcf.rds">all_packages_dcf.rds</a>: A list of matrices where each matrix is generated by <code>read.dcf()</code> on the <code>DESCRIPTION</code> file.</li>
<li><a href="https://pkgndep.github.io/all_packages_df.rds">all_packages_df.rds</a>: A data frame which is transformed from <code>all_packages_dcf.rds</code>, also dates are properly parsed.</li>
<li><a href="https://pkgndep.github.io/all_packages_description.rds">all_packages_description.rds</a>: A list of texts from the <code>DESCRIPTION</code> files.</li>
<li><a href="https://pkgndep.github.io/all_packages_namespaces.rds">all_packages_namespaces.rds</a>: A list of texts from the <code>NAMESPACE</code> files.</li>
<li><a href="https://pkgndep.github.io/cran_archived_all_time.rds">cran_archived_all_time.rds</a>: The archived dates of CRAN packages.</li>
<li><a href="https://pkgndep.github.io/cran_removed.rds">cran_removed.rds</a>: The removed dates of CRAN packages.</li>
<li><a href="https://pkgndep.github.io/lt_duration.rds">lt_duration.rds</a>: The timeline of all packages.</li>
</ul>
</div>

</div>

<script>
 $( function() {
    $( "#tabs" ).tabs();
  } );
  </script>

