### packageRank 0.9.8

#### Documentation
 
 - amend/update README.

#### Fixes

- fix multiPlot(r.version = TRUE, graphics = "base").
- fix ggplot2 xlab in plot.packageDistribution().
- fix y labels in plot.packageRank().
- fix output of packageHistory("R").
- fix cranDownloads("R", when).

#### Function Changes

- remove parallel code from packageLog().
- amend/add singlePlot(axis.package, axis.package.version).
- add cranPlot(axis.package, axis.package.version).
- add rPlot(axis.package, axis.package.version) 
- add rTotPlot(axis.package, axis.package.version).
- add multiPlot(axis.package, axis.package.version).
- add/set plot.cranDownloads(axis.package = NULL, axis.package.version = FALSE).
- add multiPlot(package.version) for "base" and "ggplot2".
- enable singlePlot(package.version = TRUE, graphics = "ggplot2").
- disable multiPlot(package.version) for "base" and "gglot2".
- add gg_axis.annotation_polygon(axis.package, axis.package.version).
- set geom_vline(colour = "black") in singlePlot(package.version = TRUE).
- enable package.version for singlePlot(graphics = "ggplot2").
- archive populationPlot().
- integrate packageDistribution() into cranDistribution().
- change 'num.rank' to 'rank' in queryRank().
- fix inProgressEstimate(unit.observation = "month") for December.
- add plot.packageLog() and print.packageLog().
- filter out packages with zero observations in plot.packageLog().
- replace 'packages' argument/object with 'package' in bioconductorDownloads().
- amend variable order in cranDownloads().
- set r.ver = "4.5" in cranPackageSize().
- add current UTC to logInfo(details = TRUE).
- format logInfo(details = TRUE) output.
- amend argument order and set localTime(time, date = Sys.Date()).
- change 'time.unit' to 'unit.observation' in plot.packageLog().

#### Graphic Changes

- change 'size' to geom_vline(linewidth) and set geom_label(size = 2.5).
- add day of week to title in plot.packageLog().
- fix plot() in bioc_plot().
- fix ylabs in gg_bioc_plot(log.y = TRUE).

### packageRank 0.9.7

#### Data

- add packageRank::missing.dates: 8/25-8/26 and 8/29-9/02 in 2025.


#### Function Changes

- amend data type in fetchCranLog(): Character to Date.
- archive addSmoother(), smoothWeekData(), addSinglePlotSmoother() and 
  addMultiPlotSmoother().
- set cachem::cache_mem(max_size = 1.5 * 1024 * 1024^2) for memoise().
- remove computation of sequenceFilter() from packageLog(all.filters = TRUE).
- add/set logInfo(check.days = 7) and amend 'cranlogs' check.
- set ipFilter(multi.core = FALSE) in packageLog().
- add/set packageLog(version.filter = FALSE).
- use pkgsearch::cran_package_history()$`crandb_file_date` for 
  plot.cranDownloads(package.version).
- use ggplot::labs().
- add date argument to versionFilter().
- amend/update filters in filteredDownloads(), packageCountry(), 
  countryDistribution(), countryPackage() and ipPackage(); all.filters = TRUE 
  only enables IP and small filters.
- add packageHistory() version of versionFilter().


#### Graphic/Plot Changes 

- enable 'chatgpt' and 'r.version' arguments in 
  plot.cranDownloads(graphics = "ggplot2")
- add variable-sized polygons for packageRank::missing.dates.
- add missingDatesPolygons() and gg_axis.annotation_polygon().
- add annualPlot()
- set plot.cranDownloads(chatgpt = "line").

#### Fixes

- fix plot.cranDownloads(weekend = TRUE).
- add smoother subtitle to singlePlot(unit.observation != "day").


### packageRank 0.9.6

#### Function Changes

- rename argument 'show.weekend' to 'weekend' in plot.cranDownloads().
- use fasttime::fastPOSIXct() in dateTime().
- replace as.POSIXlt() with as.POSIXct() in utc.R functions.
- make rLog() internal.
- replace "GMT" with "UTC".
- re-enable/set packageLog(multi.core = FALSE).
- set sequenceFilter(delta.time = 240).

#### Graphic/Plot Changes (base graphics)

- remove legend box and title for rPlot(unit.observation = "day").
- set legend(bg = NULL) in plot.cranDownloads() functions.
- allow package.version = "line" and r.version = "line" in plot.cranDownloads().
- add/set plot.cranDownloads(chatgpt = FALSE) for graphics = "base".
- allow chatgpt = "line" in plot.cranDownloads().
- add/set plot.cranDownloads(weekend = FALSE).

#### Fixes

- fix packageHistory() with multiple packages in singlePlot().
- compute date-time for packages before use of sequenceFilter().
- add exception in packageLog() for packages that don't survive ipFilter().
- fix rle() duplicates in removeSequences().


### packageRank 0.9.5

#### Function Changes

- set annualDownloads() internal.
- show day of week in print.cranDistribution().
- prioritize packageCRAN() over 'pkgsearch' results in packageHistory().

#### Fixes

- fix rPlot() for log.y = TRUE and graphics = "ggplot2".
- fix unmatched seq.start and seq.stop in removeSequences().
- fix plot.cranDownloads(unit.observation = "year").


### packageRank 0.9.4

#### Function Changes

- match input vector order with output data frame in packageRank() and
  queryPackage().
- add/set queryPackage(check.package = TRUE).
- move unique.packages to cranDistribution() list element and return via
  summary().
- add/set print.cranDistribution(top.n = 20).
- remove parallel implementation of packageLog().
- amend stop() message in fixDate_2012().
- add 2012 exception to rev_fixDate_2012().
- add total downloads to print.cranDistribution() & summary.cranDistribution().
- use localTime() in logInfo().

#### Plot Changes

- amend title and subtitle in plot.cranDistribution().
- amend x-axis in plot.packageDistribution().
- add day of week to plot.cranDistribution() title.

#### Fixes

- fix memoization in cranDistribution().


### packageRank 0.9.3

#### New Functionality

- add cranDistribution() with plot, print and summary methods.
- add queryCount(), queryPackage(), queryPercentile() and queryRank().
- refactor and use memoization and cranDistribution() in packageRank().

#### Function Changes

- add/set packageRank(rank.ties = TRUE).
- compute cores only for cranDistribution(ip.filter = TRUE).

#### Plot Changes

- use grDevices::devAskNewPage() with multiple packages in 
  plot.packageRank(graphics = "base").

#### Fixes

- fix transitory problem of multiple instances of a package on CRAN during a
  package update.


### packageRank 0.9.2

#### Fixes

- amend pro.mode = TRUE error message for cranDownloadsB() 'from' argument.
- amend 'cranlogs' guess-timate in logInfo().
- fix multiple smoother subtitles: addMultiPlotSmoother and addRPlotSmoother().


### packageRank 0.9.1

#### New Functionality

- add/set cranDownloads(pro.mode = FALSE).

#### Fixes/Updates

- update cranMirrors().
- fix cranDownloads(to = NULL).
- fix dayOfMonth(end.of.month = TRUE).
- fix plot(cranDownloads(pkg, when = "last-month"), unit.observation = "week", 
  smooth = TRUE).
- fix smoothWeekData() call in addSmoother()

#### Plot Changes

- use title case for axes labels.
- contextualize smoother subtitle in plot.cranDownloads(graphics = "base").

#### Documentation

- amend discussion of smoother parameters (loess as "default") in README.


### packageRank 0.9.0

#### New Functionality

- add rLog().
- add cranPackageSize(mac.ver = "arm").

#### Deprecated

- remove tripletFilter() - redundant with amended sizeFilter().

#### Fixes/Updates

- If available, multi.core = FALSE by default in all functions.

- amend/correct aggregateData(unit.observation = "week").
- fix computeFileSizeB() for multiple size units. 
- update cranMirrors().
- update/set cranPackageSize(r.ver = "4.3").
- fix argument error in packageArchive() for sizeFilter().
- fix packageDistribution() for multiple packages.
- add timeout fix to packages_on_CRAN(), packageArchive() and packageCRAN().
- fix/ensure exact package name matching in packageCRAN().
- return latest release in package_info() for packageCRAN() (n.b. pkg updates).
- fix packageCRAN(size) and packageArchive(size).
- fix packageHistory("R").
- match point types in 
  plot.cranDownloads(graphics = "ggplot2", unit.observation = "week").
- modify removeSequences() for high volume packages.
- fix typo/error in sequenceFilter().

#### Function Changes

- use previous day if today not available in cranDownloads().
- remove non-user facing functions from NAMESPACE.

- update 'ggplot2' syntax in cranDownloads() plot functions,
  ggPlot(), gg_bioc_plot(), plot.annualDownloads(), plotDownloadsCountry(), 
  plot.packageDistribution(), plotTopCountryCodes(), plot.weeklyDownloads() and 
  plot.packageVersionPercent().

- check internet connection in bioconductorDownloads() and bioconductorRank().
- change "warn.msg" to "print.message" in checkPackage().
- remove dev.mode argument from checkPackage().
- add/set plot.countryDistribution(N = 10) for top N country domains.
- match cranlogs::cran_downloads() behavior with duplicate packages in 
  cranDownloads() and packageHistory().
- add delta count and inflation unit in filteredDownloads().
- replace ip_filter() with greedyIP() in ipFilter().
- use only counts in greedyIP() in ipFilter().
- compute run length encoding and candidate.data in ipFilter(campaigns = TRUE).
- change/set ipCount(sort.count = TRUE).
- use "file.url.date" in ipCount() and ipDownloads().
- disable parallel code for ipFilter(campaigns = TRUE).
- include local time with logInfo(details = TRUE).
- check last 3 rather than last 7 logs for logInfo(details = TRUE).
- name list elements in packageHistory().
- set packageHistory(check.package = TRUE).
- use "crandb_file_date" for dates in packageHistory().
- use packageCRAN() instead of mpackages_on_CRAN() in packageHistory().
- return empty data frame for no CRAN, no Archive in packageHistory0().
- make packageHistory0(), packageCRAN() and packageArchive() standalone and 
  private.
- change plot.annualDownloads(f = 1/4).
- add/set plot.annualDownloads(line.col = "gray") and fix outliers.
- replace log_count argument with log.y in plot.bioconductorRank and 
  plot.packageRank().
- rename/set sequenceFilter(delta.time = 10).
- add pre-flight checks to sequenceFilter() and smallFilter().
- replace identifySequences() with removeSequences() in sequenceFilter().
- set packageHistory(check.package = FALSE) in sequenceFilter().
- filter out undersized downloads of past versions in sizeFilter().
- add exception for "R" in validatePackage() and validatePackage0().
- remove tripletFilter() code from utilities.R functions.

#### Documentation

- add annualDownloads() example to README.
- add personal default plots to README.


### packageRank 0.8.3

#### Fixes

- use packageLifeFilter() only when cranDownloads(check.package = TRUE).
- remove fix for doubled cranlogs::cran_downloads(packages %in% c(NULL, pkg))
  counts; underlying 'cranlogs' issue [#68](https://github.com/r-hub/cranlogs/issues/68) fixed.

#### Documentation

- amend/update README.

####  Changes

- clean DESCRIPTION Imports.


### packageRank 0.8.2

#### Fixes

- fix "doubled" cranlogs::cran_downloads(packages = "R") R application 
  download counts in cranDownloads() from 2023-09-12 to 2023-10-02.
- fix doubled cranlogs::cran_downloads(packages %in% c(NULL, pkg)) download
  counts in cranDownloads() from 2023-09-19 to 2023-10-01.
- add timeout fix to checkPackage().

#### Function Changes

- set packageHistory(check.package = FALSE)
- remove "Today's results not available" message from cranDownloads().

#### Documentation

- amend Sunday/Wednesday R Windows application download spikes README note.
- add discussion of "doubled" counts in cranlogs::cran_downloads() to README.


### packageRank 0.8.1

#### New Functionality

- add packages_on_CRAN(), packages_in_Archive(), packages_observed_in_logs()
  and packages_partitioned().
- add extractArchiveDate().
- add/set packages_partitioned(observed.downloads = FALSE).

#### Fixes

- amend packageLog() for packages that get filtered to zero.
- amend/fix sizeFilter() for archive-only packages.
- fix pkgsearch::cran_package_history() "try-error" in packageHistory().
- fix ylim in plot.cranDownloads(graphics = "base", unit.observation = "week").
- fix logInfo() when 'cranlogs' not available.
- set filteredDownloads(all.filters = FALSE) if any individual filter is TRUE.
- add temporary timeout = 600L to packages_partitioned().
- set options(timeout = 600L) in cranPackageSize().
- sort list element names in packageHistory().

#### Function Changes

- set packageLog(check.package = FALSE) in filteredDownloads().
- memoize packages_partitioned().
- add/set dev.mode = FALSE for ipFilter() in countryDistribution(), 
  countryPackage() and ipPackage().
- add memoized archivePackages().
- refactor checkPackage().
- change result data type and content of validatePackage().
- add 'cranlogs' check to cranDownloads().
- add/use memoized packageHistory0() in packageHistory().
- allow mix of CRAN and Archive-only packages (and R) in packageHistory().
- add memoized packages_on_CRAN().
- add CRAN check to packageHistory().

#### Documentation

- note Wednesday R Windows application download spikes in README.


### packageRank 0.8.0

#### Fixes

- add lookup for exceptions in cranMirrors().
- fix plot.cranDownloads(graphics = "base", multi.plot = TRUE, smooth = TRUE).
- fix sequenceFilter() for packages not in CRAN Archive.

#### Function Change

- set annualDownloads(log.y = FALSE).
- add/set annualDownloads(sep.y = FALSE).
- add/set cranMirrors(description = FALSE).
- change logInfo(list.available = FALSE) to logInfo(show.available = FALSE).
- set class of packageHistory()$Date to "Date".
- archive/deprecate packageMRAN() and related functionality.
- set loess as default smoother in plot.cranDownloads()

#### Documentation

- add discussion about R Windows Sunday downloads to README.


### packageRank 0.7.2

#### Function Change

- add exception to logInfo() when 'cranlogs' is down.


### packageRank 0.7.1

#### Fixes
- fix/clean rPlot(r.version = TRUE).
- fix plot(cranDownloads("R"), r.total = TRUE).

#### Function Change

- logInfo() checks for last available log.

### packageRank 0.7.0

#### New Features

- add plot.cranDownloads(unit.observation = “week”).
- discuss ‘from =’ and ‘to =’ cranDownloads() shortcuts in README.

#### Fixes

- enable ipPackage().
- fix cranDownloads(“R”, to = ).
- fix output for packageHistory(“R”).

#### Function Changes

- add logInfo() and deprecate logPostInfo().
- change ‘log.count’ to ‘log.y’ in plot.bioconductorDownloads() and
    plot.cranDownloads().
- limit available unit of observations:
    - with when = “last-week” only unit.observation = “day” available.
    - with when = “last-month” AND graphics = “ggplot2”,
        unit.observation = “month” not available
- recompute cumulative count with plot.cranDownloads(unit.observation
    = “week”) to include backdate data.
- return cores = 1L on Windows with multiCore(); parallelization on
    Windows not currently available.
- use ‘ISOcodes’ in cranMirrors().

#### Graphical Changes

- amend plot.cranDownloads(graphics = “ggplot2”) legends.
- plot.cranDownloads(unit.observation = “month”) date plotted on first
    rather than last day of month.
- use observed date for first week observed data in
    plot.cranDownloads()
- set 0s to 1s to avoid NAs when plot.cranDownloads(log.y = TRUE).

#### Graphical Fixes

- amend xy labels for “count” or “cumulative” in plot.cranDownloads().

#### New Auxiliary/Helper Functions

- add fetchRLog().
- add getCorrectLogs() and rstudio.logs list object.
- add rev_fixDate_2012().
- add/set cranDownloads(fix.cranlogs = TRUE).
- add/use fixCranlogs().
- add/set logDate(fix.date = TRUE).
- add/set resolveDate(fix.date = FALSE).

### packageRank 0.6.0

#### Fixes

- amend fetchCranLog() message.
- fix tripletFilter().
- add exception and warning for packages with zero downloads (not in
    log) for packageLog() and packageRank().
- fix variable names in packageCRAN() and packageArchive().
- fix y-axis typo and labels in cranPlot().
- set data.frame(row.names = NULL) in packageHistory().
- amend/update country code top level domains in cranMirrors().

#### Function Changes

- add packageHistory(“R”).
- allow multiple packages (vector) in packageHistory() and
    packageMRAN().
- restrict parLapply() to dev.mode = TRUE.

#### Graphical Changes

- amend graphical elements for estimate and in-progress download
    counts in plot.cranDownloads().

### packageRank 0.5.0

#### Fixes

- increase fetchCranLog() timeout to 600.

#### Function Changes

- visualize different units of observation: “day” (default), “month”,
    and “year” with plot.cranDownloads(unit.observation = “day”).
- add in-progress plots with nominal and estimated totals for
    aggregate units of observation.

### packageRank 0.4.2

#### Fixes

- fix plot.cranDownloads(package.version = TRUE) for multiple
    packages.
- fix multiple version in sizeFilter() with packageHistory().
- fix and enable sizeFilter().

#### Function Changes

- add/set filteredDownloads(multi.core = TRUE).
- amend warning message with timeMsg() in logDate().

### packageRank 0.4.1

#### Function Changes

- logDate(): check download log URL before computing available_log()
    for logs available before 17:00 UTC.
- change facet_wrap(\~ package, ncol = 2) to facet_wrap(\~ package,
    nrow = 2).
- use logDate() in logPostInfo().
- enable log.count argument for plot.cranDownloads(r.total = TRUE and
    FALSE).
- enable multi.plot argument for rPlot(graphics = “ggplot2”).
- add geom_smooth(span = 3/4).

#### Fixes

- sizeFilter() and cranPackageSize(): fix multiple versions with
    package updates.

#### New Research Functions

- annualDownloads() and weeklyDownloads().

### packageRank 0.4.0

#### New Features and Functionality

- filters shortcut via all.filters = TRUE argument.
- temporarily set options(timeout = 300L) for fetchCranLog() for R
    4.0.3.
- time zone support via logDate().

#### Data Changes

- add pkg.history.
- add arch.pkgs.jul, arch.pkgs.oct, cran.pkgs.jul and cran.pkgs.oct
    samples.
- add october.downloads and july.downloads.
- add top.n.jul2020.
- rename
    blog.data![top.n to blog.data](https://latex.codecogs.com/png.image?%5Cdpi%7B110%7D&space;%5Cbg_white&space;top.n%20to%20blog.data "top.n to blog.data")top.n.oct2019.
- use serialization format = 3 for blog.data object.

#### Fixes

- amend majority rule syntax in timeFix().
- fix Mac directory changes in packageMRAN().
- fix typo in plot.countryDistribution().
- fix resolveDate() by first as.character() all dates.
- fix scrapeData() using strsplit(fixed = TRUE).
- pass ‘f’ argument, lowess() smoother span value, to rPlot().

#### Function Changes

- add add.legend argument to plot.cranFilterCounts().
- add cumsum to cranDownloads() for cumulative counts and growth
    curves.
- add dataset argument to plotTopCountryCodes().
- add packageLog(clean.out = FALSE).
- add population.seed argument to populationPlot().
- add second.place argument to plotTopCountryCodes().
- add subtitle argument to inflationPlot2().
- add wed (Wednesday) argument to inflationPlot2().
- change default orientation of ggplot2 facets in
    plot.cranDownloads().
- note packageArchive() fix for ‘testthat’ filename typo/duplicate.
- set geom_point(size = 1.5) for single day, multiple package plot in
    singlePlot()
- use alpha transparency in plot.packageRank() labels.
- use “crandb_file_date” instead of “Date/Publication” in
    packageHistory().
- use sugrrants::facet_calendar() with packageVersionPercent(),
    plotTopCountryCodes(), and plotDownloadsCountry

#### New Functions

- countryDistribution()
- cranMirrors()
- cranPackages()
- cranPackageSize()
- downloadsCountry()
- filteredDownloads()
- ipCount()
- ipDownloads()
- ipPackage()
- packageMRAN()
- topCountryCodes()

#### New Filter Functions

- ipFilter()
- sequenceFilter()
- sizeFilter()
- smallFilter()
- tripletFilter()

#### New Helper Functions

- checkPackage()
- cleanLog()
- dateTime()
- packageSample()
- validatePackage()

#### New Time/Time Zone Functions

- currentTime()
- utc()
- utc0()
- localTime()
- logDate()
- logPostInfo()

#### New/Amended Blog specific Functions

- countsRanks()
- cranPlot()
- inflationPlot2()
- monthlyLog()
- packageVersionPercent()
- versionPlot()

### packageRank 0.3.5

#### Blog specific functions

- countsRanks()
- inflationPlot()

#### Data Changes

- add blog.data

#### Fixes

- fixDate_2012() for packageLog() Correct mislabeled filenames for
    2012 logs RStudio’s CRAN download logs at
    <http://cran-logs.rstudio.com/>.

- fix “`geom_smooth()` using formula ‘y \~ x’” warning for ‘ggplot2’
    v3.3.0.

#### Function Changes

- enable arbitrary “to” argument without “from” in cranDownloads()
    e.g., cranDownloads(from = NULL, to = “2020-01-01”).
- add/amend plot.cranDownloads(package.version = FALSE, r.version =
    FALSE).
- set plot.cranDownloads(points = “auto”) for \<= 45 days.
- “spell check” package names via “check.package” argument
    cranDownloads(), packageDistribution(), packageRank()
- deprecate packageRankTime() -\> plot.cranDownloads(population.plot =
    TRUE)
- use packageLog(packages = NULL) to view a day’s log.
- enable negative filter values in packageLog() and packageRank().

#### New Functions

- archivePackages()
- countryPackage()
- packageArchive()
- packageCountry()
- packageDistribution()
- packageHistory() uses ‘pkgsearch’; packageHistory0() scrapes CRAN.
- packageInfo()
- validatePackage() uses ‘pkgsearch’; validatePackage0() scrapes CRAN.

### packageRank 0.3.0

- add cranDownloads().
    - enable “yyyy-mm-dd”, “yyyy-mm” or “yyyy” in cranDownloads(from,
        to).
    - add plot.cran_downloads(points = “auto”).
    - add plot.cran_downloads(r.version).
- deprecate cran_downloads2().
- add dayOfMonth().
- add bioconductorDownloads().
- add bioconductorRank().

### packageRank 0.2.0

- implement minor parallelization for packageRankTime().
- base graphics for single package/date; ggplot2 for multiple
    packages/dates.
- fix smooth argument in plot.package_rank_time(graphics_pkg =
    “base”).

### packageRank 0.1.0

- first CRAN release.
