From 0eff9930846623351aa85e01a58c73debf6223fe Mon Sep 17 00:00:00 2001 From: Yaoxiang Li Date: Thu, 3 Oct 2024 16:23:03 -0400 Subject: [PATCH] init --- .Rbuildignore | 25 ++ .github/.gitignore | 1 + .github/CONTRIBUTING.md | 32 ++ .github/issue_template.md | 10 + .github/pull_request_template.md | 20 + .github/workflows/R-CMD-check.yaml | 84 +++++ .github/workflows/test-coverage.yaml | 68 ++++ .gitignore | 10 + DESCRIPTION | 60 +++ NAMESPACE | 16 + NEWS.md | 62 ++++ R/helpers.R | 145 ++++++++ R/medrxivr-package.R | 14 + R/mx_api.R | 177 +++++++++ R/mx_crosscheck.R | 51 +++ R/mx_download.R | 121 +++++++ R/mx_export.R | 38 ++ R/mx_info.R | 23 ++ R/mx_search.R | 341 ++++++++++++++++++ R/mx_snapshot.R | 36 ++ R/mx_syntax.R | 125 +++++++ README.Rmd | 185 ++++++++++ README.md | 236 ++++++++++++ _pkgdown.yml | 11 + appveyor.yml | 51 +++ codecov.yml | 12 + codemeta.json | 324 +++++++++++++++++ inst/CITATION | 22 ++ inst/WORDLIST | 57 +++ inst/paper.bib | 28 ++ inst/paper.md | 36 ++ man/api_link.Rd | 18 + man/api_to_df.Rd | 18 + man/clean_api_df.Rd | 18 + man/figures/hex-medrxivr-wide.png | Bin 0 -> 19645 bytes man/figures/logo.png | Bin 0 -> 24237 bytes man/fix_caps.Rd | 22 ++ man/fix_near.Rd | 15 + man/fix_wildcard.Rd | 15 + man/internet_check.Rd | 15 + man/medrxivr-package.Rd | 39 ++ man/mx_api_content.Rd | 58 +++ man/mx_api_doi.Rd | 41 +++ man/mx_caps.Rd | 38 ++ man/mx_crosscheck.Rd | 26 ++ man/mx_download.Rd | 43 +++ man/mx_export.Rd | 33 ++ man/mx_info.Rd | 20 + man/mx_reporter.Rd | 34 ++ man/mx_search.Rd | 68 ++++ man/mx_snapshot.Rd | 35 ++ man/print_full_results.Rd | 24 ++ man/run_search.Rd | 32 ++ man/skip_if_api_message.Rd | 12 + medrxivr.Rproj | 22 ++ pkgdown/favicon/apple-touch-icon-120x120.png | Bin 0 -> 9051 bytes pkgdown/favicon/apple-touch-icon-152x152.png | Bin 0 -> 12332 bytes pkgdown/favicon/apple-touch-icon-180x180.png | Bin 0 -> 15134 bytes pkgdown/favicon/apple-touch-icon-60x60.png | Bin 0 -> 3934 bytes pkgdown/favicon/apple-touch-icon-76x76.png | Bin 0 -> 5276 bytes pkgdown/favicon/apple-touch-icon.png | Bin 0 -> 15134 bytes pkgdown/favicon/favicon-16x16.png | Bin 0 -> 708 bytes pkgdown/favicon/favicon-32x32.png | Bin 0 -> 1656 bytes pkgdown/favicon/favicon.ico | Bin 0 -> 15086 bytes tests/spelling.R | 6 + tests/testthat.R | 4 + tests/testthat/test-api.R | 54 +++ tests/testthat/test-crosscheck.R | 5 + tests/testthat/test-download.R | 50 +++ tests/testthat/test-export.R | 21 ++ tests/testthat/test-helpers.R | 27 ++ tests/testthat/test-info.R | 3 + tests/testthat/test-search.R | 124 +++++++ tests/testthat/test-syntax.R | 37 ++ vignettes/.gitignore | 2 + .../building-complex-search-strategies.Rmd | 147 ++++++++ vignettes/data_sources.png | Bin 0 -> 61400 bytes vignettes/figs/data_sources.pptx | Bin 0 -> 48184 bytes vignettes/medrxiv-api.Rmd | 67 ++++ vignettes/medrxivr.Rmd | 174 +++++++++ 80 files changed, 3788 insertions(+) create mode 100644 .Rbuildignore create mode 100644 .github/.gitignore create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/issue_template.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/R-CMD-check.yaml create mode 100644 .github/workflows/test-coverage.yaml create mode 100644 .gitignore create mode 100644 DESCRIPTION create mode 100644 NAMESPACE create mode 100644 NEWS.md create mode 100644 R/helpers.R create mode 100644 R/medrxivr-package.R create mode 100644 R/mx_api.R create mode 100644 R/mx_crosscheck.R create mode 100644 R/mx_download.R create mode 100644 R/mx_export.R create mode 100644 R/mx_info.R create mode 100644 R/mx_search.R create mode 100644 R/mx_snapshot.R create mode 100644 R/mx_syntax.R create mode 100644 README.Rmd create mode 100644 README.md create mode 100644 _pkgdown.yml create mode 100644 appveyor.yml create mode 100644 codecov.yml create mode 100644 codemeta.json create mode 100644 inst/CITATION create mode 100644 inst/WORDLIST create mode 100644 inst/paper.bib create mode 100644 inst/paper.md create mode 100644 man/api_link.Rd create mode 100644 man/api_to_df.Rd create mode 100644 man/clean_api_df.Rd create mode 100644 man/figures/hex-medrxivr-wide.png create mode 100644 man/figures/logo.png create mode 100644 man/fix_caps.Rd create mode 100644 man/fix_near.Rd create mode 100644 man/fix_wildcard.Rd create mode 100644 man/internet_check.Rd create mode 100644 man/medrxivr-package.Rd create mode 100644 man/mx_api_content.Rd create mode 100644 man/mx_api_doi.Rd create mode 100644 man/mx_caps.Rd create mode 100644 man/mx_crosscheck.Rd create mode 100644 man/mx_download.Rd create mode 100644 man/mx_export.Rd create mode 100644 man/mx_info.Rd create mode 100644 man/mx_reporter.Rd create mode 100644 man/mx_search.Rd create mode 100644 man/mx_snapshot.Rd create mode 100644 man/print_full_results.Rd create mode 100644 man/run_search.Rd create mode 100644 man/skip_if_api_message.Rd create mode 100644 medrxivr.Rproj create mode 100644 pkgdown/favicon/apple-touch-icon-120x120.png create mode 100644 pkgdown/favicon/apple-touch-icon-152x152.png create mode 100644 pkgdown/favicon/apple-touch-icon-180x180.png create mode 100644 pkgdown/favicon/apple-touch-icon-60x60.png create mode 100644 pkgdown/favicon/apple-touch-icon-76x76.png create mode 100644 pkgdown/favicon/apple-touch-icon.png create mode 100644 pkgdown/favicon/favicon-16x16.png create mode 100644 pkgdown/favicon/favicon-32x32.png create mode 100644 pkgdown/favicon/favicon.ico create mode 100644 tests/spelling.R create mode 100644 tests/testthat.R create mode 100644 tests/testthat/test-api.R create mode 100644 tests/testthat/test-crosscheck.R create mode 100644 tests/testthat/test-download.R create mode 100644 tests/testthat/test-export.R create mode 100644 tests/testthat/test-helpers.R create mode 100644 tests/testthat/test-info.R create mode 100644 tests/testthat/test-search.R create mode 100644 tests/testthat/test-syntax.R create mode 100644 vignettes/.gitignore create mode 100644 vignettes/building-complex-search-strategies.Rmd create mode 100644 vignettes/data_sources.png create mode 100644 vignettes/figs/data_sources.pptx create mode 100644 vignettes/medrxiv-api.Rmd create mode 100644 vignettes/medrxivr.Rmd diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..c27202e --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,25 @@ +^medrxivr\.Rproj$ +^\.Rproj\.user$ +^LICENSE\.md$ +^README\.Rmd$ +^\.travis\.yml$ +^appveyor\.yml$ +^data-raw$ +^codecov\.yml$ +pdf/ +^_pkgdown\.yml$ +^docs$ +^pkgdown$ +^CODE_OF_CONDUCT\.md$ +data-extraction/ +.github/ +ropensci.* +figs/ +.here +^\.github$ +^vignettes/medrxiv-api.Rmd +^vignettes/building-complex-search-strategies.Rmd +^cran-comments\.md$ +medrxiv_export.bib +^codemeta\.json$ +^CRAN-RELEASE$ diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..2d19fc7 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..cab839e --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# Contributing + +Development is a community effort, and we welcome participation. + +## Code of Conduct + +Please note that this package is released with a [Contributor Code of Conduct](https://ropensci.org/code-of-conduct/). + +## Issues + + is for maintenance tasks feature requests. When you post, please abide by the same guidelines as . + +## Development + +External code contributions are extremely helpful in the right circumstances. Here are the recommended steps. + +1. Prior to contribution, please propose your idea in a discussion thread so you and the maintainer can define the intent and scope of your work. +2. [Fork the repository](https://help.github.com/articles/fork-a-repo/). +3. Follow the [GitHub flow](https://guides.github.com/introduction/flow/index.html) to create a new branch, add commits, and open a pull request. +4. Discuss your code with the maintainer in the pull request thread. +5. If everything looks good, the maintainer will merge your code into the project. + +Please also follow these additional guidelines. + +* Respect the architecture and reasoning of the package. Depending on the scope of your work, you may want to read the design documents (package vignettes). +* If possible, keep contributions small enough to easily review manually. It is okay to split up your work into multiple pull requests. +* Format your code according to the [tidyverse style guide](https://style.tidyverse.org/) and check your formatting with the `lint_package()` function from the [`lintr`](https://github.com/jimhester/lintr) package. +* For new features or functionality, add tests in `tests`. Tests that can be automated should go in `tests/testthat/`. Tests that cannot be automated should go in `tests/interactive/`. For features affecting performance, it is good practice to add profiling studies to `tests/performance/`. +* Check code coverage with `covr::package_coverage()`. Automated tests should cover all the new or changed functionality in your pull request. +* Run overall package checks with `devtools::check()` and `goodpractice::gp()` +* Describe your contribution in the project's [`NEWS.md`](https://github.com/ropensci/targets/blob/main/NEWS.md) file. Be sure to mention relevent GitHub issue numbers and your GitHub name as done in existing news entries. +* If you feel contribution is substantial enough for official author or contributor status, please add yourself to the `Authors@R` field of the [`DESCRIPTION`](https://github.com/ropensci/targets/blob/main/DESCRIPTION) file. diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 0000000..836f284 --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,10 @@ + + + + +
Session Info + +```r + +``` +
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..e1beac8 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ + + + + + + +## Description + + +## Related Issue + + +## Example + + + diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..67bf99e --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,84 @@ +# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag. +# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions +on: + push: + branches: + - master + pull_request: + branches: + - master + +name: R-CMD-check + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: windows-latest, r: 'release'} + - {os: macOS-latest, r: 'release'} + - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} + + env: + R_REMOTES_NO_ERRORS_FROM_WARNINGS: true + RSPM: ${{ matrix.config.rspm }} + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + + - uses: r-lib/actions/setup-pandoc@v2 + + - name: Install system dependencies (Linux) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev libssl-dev + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") + shell: Rscript {0} + + - name: Cache R packages (Linux and macOS) + if: runner.os != 'Windows' + uses: actions/cache@v2 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1- + + - name: Install dependencies + run: | + remotes::install_deps(dependencies = TRUE) + remotes::install_cran("rcmdcheck") + shell: Rscript {0} + + - name: Install missing packages on Windows + if: runner.os == 'Windows' + run: | + install.packages(c('curl', 'openssl', 'testthat', 'hms', 'dplyr', 'rlang', 'tibble', 'progress', 'remotes', 'rcmdcheck')) + shell: Rscript {0} + + - name: Check + env: + _R_CHECK_CRAN_INCOMING_REMOTE_: false + run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check") + shell: Rscript {0} + + - name: Upload check results + if: failure() + uses: actions/upload-artifact@main + with: + name: ${{ runner.os }}-r${{ matrix.config.r }}-results + path: check diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 0000000..37b77e9 --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,68 @@ +on: + push: + branches: + - master + pull_request: + branches: + - master + +name: test-coverage + +jobs: + test-coverage: + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + + - uses: r-lib/actions/setup-pandoc@v2 + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev libssl-dev + + - name: Query dependencies + run: | + install.packages('remotes') + saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) + writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version") + shell: Rscript {0} + + - name: Cache R packages + uses: actions/cache@v3 + with: + path: ${{ env.R_LIBS_USER }} + key: ${{ runner.os }}-R-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }} + restore-keys: ${{ runner.os }}-R-${{ hashFiles('.github/R-version') }}-1- + + - name: Install dependencies + run: | + install.packages(c("remotes", "covr")) + remotes::install_deps(dependencies = TRUE) + shell: Rscript {0} + + - name: Check for missing packages + run: | + missing_pkgs <- setdiff(c("covr", "testthat"), rownames(installed.packages())) + if (length(missing_pkgs) > 0) { + cat("Missing packages:", paste(missing_pkgs, collapse = ", "), "\n") + install.packages(missing_pkgs) + } else { + cat("All required packages are installed.\n") + } + shell: Rscript {0} + + - name: Run tests + run: | + testthat::test_local() + shell: Rscript {0} + + - name: Test coverage + run: covr::codecov() + shell: Rscript {0} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..94b3f61 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.Rproj.user +.Rhistory +.RData +inst/doc +pdf/ +docs/ +extract/keys +ropensci.* +inst/paper.html +medrxiv_export.bib diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..aeb6d20 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,60 @@ +Package: medrxivr +Title: Access and Search MedRxiv and BioRxiv Preprint Data +Version: 0.1.0 +Authors@R: c( + person("Yaoxiang", "Li", + role = c("aut", "cre"), + email = "liyaoxiang@outlook.com", + comment = c(ORCID="0000-0001-9200-1016")), + person("Luke", "McGuinness", + role = c("aut")), + person("Lena", "Schmidt", + role = "aut"), + person("Tuija", "Sonkkila", + role = "rev"), + person("Najko", "Jahn", + role = "rev")) +Description: An increasingly important source of health-related bibliographic + content are preprints - preliminary versions of research articles that have + yet to undergo peer review. The two preprint repositories most relevant to + health-related sciences are medRxiv and + bioRxiv , both of which are operated by the Cold + Spring Harbor Laboratory. 'medrxivr' provides programmatic access to the + 'Cold Spring Harbour Laboratory (CSHL)' API , + allowing users to easily download medRxiv and bioRxiv preprint metadata + (e.g. title, abstract, publication date, author list, etc) into R. + 'medrxivr' also provides functions to search the downloaded preprint records + using regular expressions and Boolean logic, as well as helper functions + that allow users to export their search results to a .BIB file for easy + import to a reference manager and to download the full-text PDFs of + preprints matching their search criteria. +License: GPL-2 +Encoding: UTF-8 +LazyData: true +Language: en-US +URL: https://github.com/ropensci/medrxivr +BugReports: https://github.com/ropensci/medrxivr/issues +Imports: + methods, + dplyr, + curl, + jsonlite, + httr, + stringr, + rlang, + bib2df, + tibble, + progress, + lubridate, + purrr, + data.table +Suggests: + testthat (>= 2.1.0), + knitr, + rmarkdown, + covr, + kableExtra, + spelling +VignetteBuilder: + knitr +RoxygenNote: 7.3.2 diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..a3a44e9 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,16 @@ +# Generated by roxygen2: do not edit by hand + +export(mx_api_content) +export(mx_api_doi) +export(mx_caps) +export(mx_crosscheck) +export(mx_download) +export(mx_export) +export(mx_search) +export(mx_snapshot) +importFrom(dplyr,"%>%") +importFrom(methods,is) +importFrom(rlang,.data) +importFrom(stats,runif) +importFrom(utils,download.file) +importFrom(utils,read.csv) diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..9641af3 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,62 @@ +# medrxivr (development version) + +* `datatable::fread()` is now used in place of `vroom::vroom()` to import the snapshot + +# medrxivr 0.0.5 + +Major changes: + +* Improved error handling to address a common bug that causes extraction from the API to fail. The "total number" of records element of the API metadata is frequently artificially inflated. This leads to an overestimation of the number of pages of records, which in turn caused the extraction function to fail at the very end when `mx_api_content()` encounters an empty page. This error has been changed to informative messaging about the expected (as per the metadata) and actual (`nrows()` of returned dataset) number of retrievable records. +* New functionality added to `mx_search()` allows users to view the number of "hits" (records returned) for each individual element of the search. An extra parameter called `report` has been added, which gives the user the option to switch this functionality on or off. The default value for this parameter is set to FALSE. This functionality was added by [James O'Hare](https://github.com/jamesohare1) in response to [Issue #13.](https://github.com/ropensci/medrxivr/issues/13) +* Users can now pass a vector of terms to the `NOT` parameter rather than a single exclusion term. +* New functionality to allow for user-friendly search operators, including wildcards ("randomi*ation" will now find "randomisation" and "randomization") and the NEAR operator ("systematic NEAR1 review" will find "systematic review" and "systematic __ review") +* A new argument, `auto_caps`, in the `mx_search()` function to allow for automatic capitalisation of the first character in each search term (e.g. with `auto_caps = TRUE`, "dementia" will be automatically converted to "[Dd]ementia" which will find "**d**ementia" and also "**D**ementia"). This replaces the recommendation that users capitalise the first character themselves using square brackets. However, if user defined alternative are already in place for the first character of the search term, then these are left untouched. +* A helper function, `mx_caps()`, allows users to wrap search terms to find all possible combinations of upper- and lower-case letters in that term. For example, `mx_caps("ncov")` converts the term to "[Nn][Cc][Oo][Vv]" which will find "NCOV", "Ncov", "nCOV", "nCoV", etc. + +# medrxivr 0.0.4 + +Major changes: + +* Fixed error which occurred when downloading the whole bioRxiv database. This was caused by any record above 100000 being presented in scientific notation (e.g. 1e+05), which meant the API returned an invalid response. +* Change tests to fix runtime regardless of future growth of the repositories + +# medrxivr 0.0.3 + +Version created for submission to JOSS and CRAN, and onboarded to rOpenSci following peer-review. + +Major changes: + +* `mx_snapshot()` now takes a `commit` argument, allowing you to specify exactly which snapshot of the database you would like to use. Details on the commit keys needed are [here](https://github.com/mcguinlu/medrxivr-data/commits/master/snapshot.csv). In addition, the process of taking the snapshot is now managed by GitHub actions, meaning it should be a lot more robust/regular/ +* Importing the snapshot to R is now significantly faster, as `vroom::vroom()` is used in place of `read.csv()` +* All functions that return a data frame now return ungrouped tibbles. +* The to/from date arguments for both `mx_search()` and `mx_api_content()` have been standardized to snake case and now expect the same "YYYY-MM-DD" character format. +* A progress indicator has been added to `mx_api_content()` provide useful information when downloading from the API. +* Some refactoring of code has taken place to reduce duplication of code chunks and to make future maintenance easier. + +Minor changes: + +* `mx_crosscheck()` no longer uses web-scraping when providing the number of +* Documentation has been updated to reflect the changes, and some additional sections added to the vignettes. This includes removing references to older versions of the functions names (e.g. `mx_raw()`). +* Additional test have been written, and the overall test coverage has been increased. Some lines (handling exceptional rare errors that can't be mocked) have been marked as `#nocov`. +* \dontrun had been replaced with \donttest in all examples across the package. +* All examples for mx_download() and mx_export() now use tempfile() and tempdir(), so as not to modify the users home filespace when running the examples. + + + + +# medrxivr 0.0.2 + +Major changes: + +* Following the release of the [medRxiv API](https://api.biorxiv.org/), the way the snapshot of the medRxiv site is taken has changed, resulting in a more accurate snapshot of the entire repository being taken daily (as opposed to just new articles being captured, as was previously the case). This has introduced some breaking changes (e.g. in the `fields` argument, "subject" has become "category", and "link" has become "doi"), but will result in better long-term stability of the package. +* Two new functions, `mx_api_content()` and `mx_api_doi()`, have been added to allow users to interact with the medRxiv API endpoints directly. A new vignette documenting these functions has been added. +* The API has also allowed for improved data collection. The "authors" variable searched/returned now contains all authors of the paper as opposed to just the first one. Several additional fields are now returned, including corresponding author's institution, preprint license, and the DOI of the published, peer-reviewed version of preprint (if available). +* A companion app was launched, which allows you to build the search strategy using a user-friendly interface and then export the code needed to run it directly from R. +* You can now define the field(s) you wish to search. By default, the Title, Abstract, First Author, Subject, and Link (which includes the DOI) fields are searched. +* There is no longer a limit on the number of distinct topics you can search for (previously it was 5). +* The output of `mx_search()` has been cleaned to make it more useful to future end-users. Of note, some of the columns names have changed, and the "pdf_name" and "extraction_date" variables are no longer returned. + + +# medrxivr 0.0.1 + +* Added a `NEWS.md` file to track changes to the package. diff --git a/R/helpers.R b/R/helpers.R new file mode 100644 index 0000000..f3a14a1 --- /dev/null +++ b/R/helpers.R @@ -0,0 +1,145 @@ +#' Checks whether the user has internet, and returns a helpful message it not. +#' +#' @return Informative error if not connected to the internet +#' @keywords internal + +internet_check <- function() { + if (curl::has_internet() == FALSE) { # nocov start + stop(paste0( + "No internet connect detected - ", + "please connect to the internet and try again" + )) + } # nocov end +} + +#' Convert API data to data frame +#' +#' @param url API endpoint from which to extract and format data +#' +#' @return Raw API data in a dataframe +#' @keywords internal +#' +#' @importFrom dplyr %>% + +api_to_df <- function(url) { + details <- httr::RETRY( + verb = "GET", + times = 3, + url = url, + httr::timeout(30) + ) + + httr::stop_for_status( + details, + task = paste( + "extract data from API. As this is usually due to current user load,", + "please try again in a little while, or use the maintained", + "static daily snapshot (available for medRxiv only)" + ) + ) + + code <- details$status_code + + message <- httr::content(details, as = "text", encoding = "UTF-8") + + if (code == 200 & + message == "Error : (2002) Connection refused") { # nocov start + stop(paste( + "API connection refused.", + "As this is usually due to current user load,", + "please try again in a little while, or use the maintained", + "static daily snapshot (available for medRxiv only)" + )) + } # nocov end + + # Extract cursor from url and check if first page is empty This causes an + # error only if the very first page, indicated by cursor == "0", is empty. + # This approach allows for elegant handling of the discrepancy between the + # expected total number of records as per the metadata and the actual number + # available, while maintaining the informative error if the first page is + # empty. + cursor <- + stringr::str_split(url, "/") %>% + unlist() %>% + dplyr::last() + + if (code == 200 & grepl("no posts found", message) & cursor == "0") { + stop(paste( + "No records found. Please double check your date range,", + "as this is the usual cause of this error." + )) + } + + details <- details %>% + httr::content(as = "text", encoding = "UTF-8") %>% + jsonlite::fromJSON() +} + +#' Create link for API +#' +#' @param ... Arguments to specify the path to the API endpoint +#' +#' @return Formatted link to API endpoint +#' @keywords internal + +api_link <- function(...) { + path_arg <- c(...) + + httr::modify_url("https://api.biorxiv.org/", + path = c( + "details", + path_arg + ) + ) +} + +#' Helper script to clean data from API to make it compatible with mx_search() +#' +#' @param df Raw dataframe from API +#' +#' @return Cleaned dataframe +#' @keywords internal +#' +#' @importFrom dplyr %>% + +clean_api_df <- function(df) { + df$node <- seq_len(nrow(df)) + + df <- df %>% + dplyr::select(-c(.data$type)) + + df$link <- paste0("/content/", df$doi, "v", df$version, "?versioned=TRUE") + df$pdf <- paste0("/content/", df$doi, "v", df$version, ".full.pdf") + df$category <- stringr::str_to_title(df$category) + df$authors <- stringr::str_to_title(df$authors) + df$author_corresponding <- stringr::str_to_title(df$author_corresponding) + + df$link_page <- paste0("https://www.", df$server, ".org", df$link) + df$link_pdf <- paste0("https://www.", df$server, ".org", df$pdf) + + df <- df %>% + dplyr::select(-c(.data$server, .data$link, .data$pdf)) + + df +} + + +#' Skips API tests if API isn't working correctly +#' +#' @keywords internal + +skip_if_api_message <- function() { + details <- httr::RETRY( + verb = "GET", + times = 3, + url = "https://api.biorxiv.org/details/medrxiv/2020-06-21/2020-08-28/45", + httr::timeout(30) + ) + code <- details$status_code + + message <- httr::content(details, as = "text", encoding = "UTF-8") + + if (code == 200 & message == "Error : (2002) Connection refused") { + testthat::skip("API connection refused") # nocov + } +} diff --git a/R/medrxivr-package.R b/R/medrxivr-package.R new file mode 100644 index 0000000..a1d1ab9 --- /dev/null +++ b/R/medrxivr-package.R @@ -0,0 +1,14 @@ +#' medrxivr: Accessing medRxiv and bioRxiv preprint data from R +#' +#' The medrxivr package enables users to access data on preprints in the medRxiv +#' and bioRxiv preprints repositories, both of which are run by the Cold Spring +#' Harbour Laboratory.It also provides functions to search the preprint data, +#' export it to a .bib file, and download the PDFs associated with specified +#' records. +#' @keywords internal +"_PACKAGE" +globalVariables(c("doi")) + +## usethis namespace: start +## usethis namespace: end +NULL diff --git a/R/mx_api.R b/R/mx_api.R new file mode 100644 index 0000000..b25a8b0 --- /dev/null +++ b/R/mx_api.R @@ -0,0 +1,177 @@ +#' Access medRxiv/bioRxiv data via the Cold Spring Harbour Laboratory API +#' +#' @description Provides programmatic access to all preprints available through +#' the Cold Spring Harbour Laboratory API, which serves both the medRxiv and +#' bioRxiv preprint repositories. +#' @param from_date Earliest date of interest, written as "YYYY-MM-DD". Defaults +#' to 1st Jan 2013 ("2013-01-01"), ~6 months prior to earliest preprint +#' registration date. +#' @param to_date Latest date of interest, written as "YYYY-MM-DD". Defaults to +#' current date. +#' @param include_info Logical, indicating whether to include variables +#' containing information returned by the API (e.g. API status, cursor number, +#' total count of papers, etc). Default is FALSE. +#' @param server Specify the server you wish to use: "medrxiv" (default) or +#' "biorxiv" +#' @param clean Logical, defaulting to TRUE, indicating whether to clean the +#' data returned by the API. If TRUE, variables containing absolute paths to +#' the preprints web-page ("link_page") and PDF ("link_pdf") are generated +#' from the "server", "DOI", and "version" variables returned by the API. The +#' "title", "abstract" and "authors" variables are converted to title case. +#' Finally, the "type" and "server" variables are dropped. +#' +#' @return Dataframe with 1 record per row +#' +#' @family data-source +#' @export +#' +#' @examples +#' if (interactive()) { +#' mx_data <- mx_api_content( +#' from_date = "2020-01-01", +#' to_date = "2020-01-07" +#' ) +#' } +#' @importFrom dplyr %>% +#' @importFrom rlang .data + +mx_api_content <- function(from_date = "2013-01-01", + to_date = as.character(Sys.Date()), + clean = TRUE, + server = "medrxiv", + include_info = FALSE) { + # Check that the user is connected to the internet + internet_check() + + # Check server + "%notin%" <- Negate("%in%") + + if (server %notin% c("medrxiv", "biorxiv")) { + stop(paste( + "Server not recognised -", + "must be one of \"medrxiv\" or \"biorxiv\"" + )) + } + + # Get descriptive details and page number + details_link <- api_link(server, from_date, to_date, "0") + details <- api_to_df(details_link) + + count <- as.numeric(details$messages[1, 6]) + + pages <- floor(count / 100) + + message("Estimated total number of records as per API metadata: ", count) + + # Create empty dataset + df <- details$collection %>% + dplyr::filter(doi == "") + + # Get data + pb <- progress::progress_bar$new( + format = paste0( + "Downloading... [:bar] :current/:total ", + "(:percent) Est. time remaining: :eta" + ), + total = count + ) + + pb$tick(0) + + for (cursor in 0:pages) { + page <- cursor * 100 + + page_link <- api_link( + server, + from_date, + to_date, + format(page, + scientific = FALSE + ) + ) + + tmp <- api_to_df(page_link) + + tmp <- tmp$collection + + df <- rbind(df, tmp) + + pb$tick(100) + } + + # Clean data + message("Number of records retrieved from API: ", nrow(df)) + + if (nrow(df) != count) { + message(paste0( + "The estimated \"total number\" as per the metadata ", # nocov + "can sometimes be artificially inflated." + )) # nocov + } + + if (clean == TRUE) { + df <- clean_api_df(df) + } + + if (include_info == TRUE) { + details <- + details$messages %>% dplyr::slice(rep(1:dplyr::n(), each = nrow(df))) + df <- cbind(df, details) + } + + tibble::as_tibble(unclass(df)) +} + + +#' Access data on a single medRxiv/bioRxiv record via the Cold Spring Harbour +#' Laboratory API +#' +#' @description Provides programmatic access to data on a single preprint +#' identified by a unique Digital Object Identifier (DOI). +#' @param doi Digital object identifier of the preprint you wish to retrieve +#' data on. +#' @param server Specify the server you wish to use: "medrxiv" (default) or +#' "biorxiv" +#' @param clean Logical, defaulting to TRUE, indicating whether to clean the +#' data returned by the API. If TRUE, variables containing absolute paths to +#' the preprints web-page ("link_page") and PDF ("link_pdf") are generated +#' from the "server", "DOI", and "version" variables returned by the API. The +#' "title", "abstract" and "authors" variables are converted to title case. +#' Finally, the "type" and "server" variables are dropped. +#' +#' @return Dataframe containing details on the preprint identified by the DOI. +#' +#' @family data-source +#' @export +#' +#' @examples +#' if (interactive()) { +#' mx_data <- mx_api_doi("10.1101/2020.02.25.20021568") +#' } +#' @importFrom dplyr %>% +#' @importFrom rlang .data + +mx_api_doi <- function(doi, + server = "medrxiv", + clean = TRUE) { + "%notin%" <- Negate("%in%") + + if (server %notin% c("medrxiv", "biorxiv")) { + stop(paste( + "Server not recognised -", + "must be one of \"medrxiv\" or \"biorxiv\"" + )) + } + + details <- api_to_df(api_link(server, doi)) + + df <- details$collection + + # Clean data + + if (clean == TRUE) { + df <- clean_api_df(df) + } + + tibble::as_tibble(unclass(df)) +} diff --git a/R/mx_crosscheck.R b/R/mx_crosscheck.R new file mode 100644 index 0000000..ed92f9c --- /dev/null +++ b/R/mx_crosscheck.R @@ -0,0 +1,51 @@ +#' Check how up-to-date the maintained medRxiv snapshot is +#' +#' @description Provides information on how up-to-date the maintained medRxiv +#' snapshot provided by `mx_snapshot()` is by checking whether there have been +#' any records added to, or updated in, the medRxiv repository since the last +#' snapshot was taken. +#' +#' @examples +#' \donttest{ +#' mx_crosscheck() +#' } +#' @family helper +#' @export + +mx_crosscheck <- function() { + internet_check() + mx_info() + + # Get number of unique records in the medRxiv archive + base_link <- api_link("medrxiv", "2019-01-01", as.character(Sys.Date()), "0") + details <- api_to_df(base_link) + + # Ensure 'reference' is numeric + reference <- as.numeric(details$messages[1, 6]) + if (is.na(reference)) { + stop("Reference value is not numeric.") + } + + # Get number of unique records extracted + data <- suppressMessages(mx_search(mx_snapshot(), + query = "*", + deduplicate = FALSE + )) + + # Ensure 'extracted' is numeric + extracted <- as.numeric(nrow(data)) + if (is.na(extracted)) { + stop("Extracted value is not numeric.") + } + + diff <- reference - extracted + + if (identical(reference, extracted)) { + message("No records added/updated since last snapshot.") # nocov + } else { + message(paste0( + diff, + " new record(s) added/updated since last snapshot" + )) + } +} diff --git a/R/mx_download.R b/R/mx_download.R new file mode 100644 index 0000000..c7fbe84 --- /dev/null +++ b/R/mx_download.R @@ -0,0 +1,121 @@ +#' Download PDF's of preprints returned by a search +#' @description Download PDF's of all the papers in your search results +#' @param mx_results Vector containing the links to the medRxiv PDFs +#' @param directory The location you want to download the PDF's to +#' @param create TRUE or FALSE. If TRUE, creates the directory if it doesn't +#' exist +#' @param name How to name the downloaded PDF. By default, both the ID number of +#' the record and the DOI are used. +#' @param print_update How frequently to print an update +#' @examples +#' \donttest{ +#' mx_results <- mx_search(mx_snapshot(), query = "10.1101/2020.02.25.20021568") +#' mx_download(mx_results, directory = tempdir()) +#' } +#' @family helper +#' @export +#' @importFrom utils download.file +#' @importFrom methods is +#' @importFrom stats runif +#' @importFrom dplyr %>% + + +mx_download <- function(mx_results, + directory, + create = TRUE, + name = c("ID", "DOI"), + print_update = 10) { + if (all(c("ID", "DOI") %in% name)) { + mx_results$filename <- paste0(mx_results$ID, "_", mx_results$doi) + } else { + if (name == "ID") { + mx_results$filename <- mx_results$ID + } + + if (name == "DOI") { + mx_results$filename <- mx_results$doi + } + } + + mx_results$filename <- gsub("/", "_", mx_results$filename) + + message(paste0( + "Estimated time to completion: ", + round(length(mx_results$link_pdf) * 13 / 60 / 60, 2), " hours" + )) + + if (!file.exists(directory) && create) { + dir.create(file.path(directory)) + } + + # Add trailing forward slash to the directory path + if (substr(directory, nchar(directory), nchar(directory)) != "/") { + directory <- paste(directory, "/", sep = "") + } + + number <- 1 + + for (file_location in mx_results$link_pdf) { + if (file.exists(paste0( + directory, + mx_results$filename[which(mx_results$link_pdf == + file_location)], + ".pdf" + ))) { + message(paste0( + "PDF already downloaded for DOI: ", + mx_results$filename[which(mx_results$link_pdf == + file_location)] + )) + + number <- number + 1 + + next + } + + while (TRUE) { + message(paste0( + "Downloading PDF ", + number, + " of ", + length(mx_results$link_pdf), + " (DOI: ", + mx_results$filename[which(mx_results$link_pdf == + file_location)], + "). . . " + )) + + sleep_time <- runif(1, 10, 13) + if (nrow(mx_results) > 1) { + Sys.sleep(sleep_time) + } + + pmx_results <- + try(download.file( + url = file_location, + destfile = paste0(directory, mx_results$filename[number], ".pdf"), + method = "auto", + mode = "wb" + )) + if (!is(pmx_results, "try-error")) { + break + } + } + + + + if ((number %% print_update == 0) == TRUE) { + message(paste0( + "PDF ", + number, + " of ", + length(mx_results$link_pdf), + " downloaded! (", + round(number / length(mx_results$link_pdf) * 100, 0), + "%) " + )) + } + + number <- number + 1 + } +} diff --git a/R/mx_export.R b/R/mx_export.R new file mode 100644 index 0000000..824da48 --- /dev/null +++ b/R/mx_export.R @@ -0,0 +1,38 @@ +#' Export references for preprints returning by a search to a .bib file +#' +#' @param data Dataframe returned by mx_search() or mx_api_*() functions +#' @param file File location to save to. Must have the .bib file extension +#' +#' @return Exports a formatted .BIB file, for import into a reference manager +#' @export +#' @family helper + +#' @examples +#' \donttest{ +#' mx_results <- mx_search(mx_snapshot(), query = "brain") +#' mx_export(mx_results, tempfile(fileext = ".bib")) +#' } +#' +mx_export <- function(data, + file = "medrxiv_export.bib") { + bib_results <- tibble::tibble( + TITLE = data$title, + ABSTRACT = data$abstract, + AUTHOR = gsub(";", " and ", data$authors), + URL = data$link_page, + DOI = data$doi, + YEAR = lubridate::year(data$date), + NOTE = paste0( + "Category: ", + data$category, + "\nPublished DOI : ", + data$published + ), + CATEGORY = rep("Article", dim(data)[1]), + BIBTEXKEY = paste0("mx-", seq(1, dim(data)[1])) + ) + + bib2df::df2bib(x = bib_results, file = file) + + message(paste("References exported to", file)) +} diff --git a/R/mx_info.R b/R/mx_info.R new file mode 100644 index 0000000..6c1851f --- /dev/null +++ b/R/mx_info.R @@ -0,0 +1,23 @@ +#' Provide information on the medRxiv snapshot used to perform the search +#' +#' @param commit Commit hash for the snapshot, taken from +#' https://github.com/mcguinlu/medrxivr-data. Defaults to "master", which will +#' return info on the most recent snapshot. +#' @keywords internal +#' @return Message with snapshot details + +mx_info <- function(commit = "master") { + current_time <- readLines(paste0( + "https://raw.githubusercontent.com/", + "mcguinlu/", + "medrxivr-data/", + commit, + "/timestamp.txt" + )) + + mess <- paste0( + "Using medRxiv snapshot - ", + current_time + ) + message(mess) +} diff --git a/R/mx_search.R b/R/mx_search.R new file mode 100644 index 0000000..0998ef1 --- /dev/null +++ b/R/mx_search.R @@ -0,0 +1,341 @@ +#' Search preprint data +#' @param data The preprint dataset that is to be searched, created either using +#' mx_api_content() or mx_snapshot() +#' @param query Character string, vector or list +#' @param fields Fields of the database to search - default is Title, Abstract, +#' Authors, Category, and DOI. +#' @param from_date Defines earliest date of interest. Written in the format +#' "YYYY-MM-DD". Note, records published on the date specified will also be +#' returned. +#' @param to_date Defines latest date of interest. Written in the format +#' "YYYY-MM-DD". Note, records published on the date specified will also be +#' returned. +#' @param auto_caps As the search is case sensitive, this logical specifies +#' whether the search should automatically allow for differing capitalisation +#' of search terms. For example, when TRUE, a search for "dementia" would find +#' both "dementia" but also "Dementia". Note, that if your term is multi-word +#' (e.g. "systematic review"), only the first word is automatically +#' capitalised (e.g your search will find both "systematic review" and +#' "Systematic review" but won't find "Systematic Review". Note that this +#' option will format terms in the query and NOT arguments (if applicable). +#' @param NOT Vector of regular expressions to exclude from the search. Default +#' is "". +#' @param deduplicate Logical. Only return the most recent version of a record. +#' Default is TRUE. +#' @param report Logical. Run mx_reporter. Default is FALSE. +#' @examples +#' \donttest{ +#' # Using the daily snapshot +#' mx_results <- mx_search(data = mx_snapshot(), query = "dementia") +#' } +#' @family main +#' @export +#' @importFrom utils download.file +#' @importFrom utils read.csv +#' @importFrom dplyr %>% + + +mx_search <- function(data = NULL, + query = NULL, + fields = c( + "title", + "abstract", + "authors", + "category", + "doi" + ), + from_date = NULL, + to_date = NULL, + auto_caps = FALSE, + NOT = "", + deduplicate = TRUE, + report = FALSE) { + # Error handling ---------------------------------------------------------- + + # Require search terms + if (is.null(data)) { + stop( + paste0( + "Please provide preprint data to search, accessed from either ", + "from either the mx_api_content(), or mx_snapshot() functions." + ) + ) + } + # Require search terms + if (is.null(query)) { + stop("Please specify search terms in the `query` argument.") + } + + # Require internet connection + if (curl::has_internet() == FALSE) { # nocov start + stop(paste0( + "No internet connect detected - ", + "please connect to the internet and try again" + )) + } # nocov end + + + # Search ------------------------------------------------------------------ + + # Load data + mx_data <- data + + # Implement data limits --------------------------------------------------- + mx_data$date <- as.numeric(gsub("-", "", mx_data$date)) + + if (!is.null(to_date)) { + to_date <- as.numeric(gsub("-", "", to_date)) + mx_data <- mx_data %>% dplyr::filter(date <= to_date) + } + + if (!is.null(from_date)) { + from_date <- as.numeric(gsub("-", "", from_date)) + mx_data <- mx_data %>% dplyr::filter(date >= from_date) + } + + + # Clean query ---------------------------------------------------------------- + + # Fix capitalisation + if (auto_caps == TRUE) { + query <- fix_caps(query) + if (NOT[1] != "") { + NOT <- fix_caps(NOT) + } + } + + query <- query %>% + fix_near() %>% + fix_wildcard() + + + # Run full search and process results ------------------------------------- + mx_results <- run_search(mx_data, query, fields, deduplicate, NOT) + num_results <- nrow(mx_results) + print_full_results(num_results, deduplicate) + + + # Run mx_reporter and process results -------------------------------------- + if (report) { + mx_reporter(mx_data, num_results, query, fields, deduplicate, NOT) + } + + # Return full search results + if (num_results > 0) { + mx_results + } +} + + +#' Search and print output for individual search items +#' @param mx_data The mx_dataset filtered for the date limits +#' @param num_results The number of results returned by the overall search +#' @param query Character string, vector or list +#' @param fields Fields of the database to search - default is Title, Abstract, +#' Authors, Category, and DOI. +#' @param deduplicate Logical. Only return the most recent version of a record. +#' Default is TRUE. +#' @param NOT Vector of regular expressions to exclude from the search. Default +#' is "". +#' @family main +mx_reporter <- function(mx_data, + num_results, + query, + fields, + deduplicate, + NOT) { + # run mx_search on individual topics, count hits and print message + for (i in 1:length(query)) { + ifelse(is.list(query), + query_i <- query[[i]], + query_i <- query[i] + ) + + mx_results <- run_search(mx_data, query_i, fields, deduplicate) + topic_hits <- nrow(mx_results) + message(cat("\n"), paste0("Total topic ", i, " records: ", topic_hits)) + + # run mx_search for and individual terms within each topic,... + # count hits and print message + for (j in 1:length(query_i)) { + mx_results <- run_search(mx_data, query_i[j], fields, deduplicate) + term_hits <- nrow(mx_results) + message(paste0(query_i[j], ": ", term_hits)) + } + } + + if (NOT[1] != "") { + # Run search excluding not term and subtract num_results + # This gives number of hits which were excluded by NOT term + not_hits <- + nrow( + run_search(mx_data, query, fields, deduplicate, NOT = "") + ) - num_results + + message( + cat("\n"), + paste0( + not_hits, + " records matched by NOT (", + paste0("'", paste0(NOT, collapse = "' OR '"), "'"), + ") were excluded." + ) + ) + } +} + + +#' Search for terms in the dataset +#' @param mx_data The mx_dataset filtered for the date limits +#' @param query Character string, vector or list +#' @param fields Fields of the database to search - default is Title, Abstract, +#' Authors, Category, and DOI. +#' @param deduplicate Logical. Only return the most recent version of a record. +#' Default is TRUE. +#' @param NOT Vector of regular expressions to exclude from the search. Default +#' is NULL. +#' @family main +#' @importFrom dplyr %>% +run_search <- function(mx_data, + query, + fields, + deduplicate, + NOT = "") { + . <- NULL + node <- NULL + link_group <- NULL + doi <- NULL + link <- NULL + + if (is.list(query)) { + # General code to find matches + + query_length <- as.numeric(length(query)) + + and_list <- list() + + for (list in seq_len(query_length)) { + tmp <- mx_data %>% + dplyr::filter_at( + dplyr::vars(fields), + dplyr::any_vars(grepl(paste( + query[[list]], + collapse = "|" + ), .)) + ) %>% + dplyr::select(node) + tmp <- tmp$node + and_list[[list]] <- tmp + } + + and <- Reduce(intersect, and_list) + } + + if (!is.list(query) & is.vector(query)) { + # General code to find matches + tmp <- mx_data %>% + dplyr::filter_at( + dplyr::vars(fields), + dplyr::any_vars(grepl(paste(query, + collapse = "|" + ), .)) + ) %>% + dplyr::select(node) + + and <- tmp$node + } + + # Exclude those in the NOT category + + if (NOT[1] != "") { + tmp <- mx_data %>% + dplyr::filter_at( + dplyr::vars(fields), + dplyr::any_vars(grepl(paste(NOT, + collapse = "|" + ), .)) + ) %>% + dplyr::select(node) + + `%notin%` <- Negate(`%in%`) + + and <- and[and %notin% tmp$node] + + results <- and + } else { + results <- and + } + + + if (length(query) > 1) { + mx_results <- mx_data[which(mx_data$node %in% results), ] + } else { + if (query == "*") { + mx_results <- mx_data + } else { + mx_results <- mx_data[which(mx_data$node %in% results), ] + } + } + + if (nrow(mx_results) > 0) { + names(mx_results)[names(mx_results) == "date_posted"] <- "date_posted" + names(mx_results)[names(mx_results) == "node"] <- "ID" + + mx_results$date <- lubridate::as_date(as.character(mx_results$date)) + + mx_results <- mx_results[, c( + "ID", + "title", + "abstract", + "authors", + "date", + "category", + "doi", + "version", + "author_corresponding", + "author_corresponding_institution", + "link_page", + "link_pdf", + "license", + "published" + )] + + if (deduplicate) { + mx_results <- mx_results %>% + dplyr::group_by(doi) %>% + dplyr::slice(which.max(version)) %>% + dplyr::ungroup() + } + } + mx_results +} + + +#' Search for terms in the dataset +#' @param num_results number of searched terms returned +#' @param deduplicate Logical. Only return the most recent version of a record. +#' Default is TRUE. +#' @family main +print_full_results <- function(num_results, + deduplicate) { + if (num_results > 0) { + # Create Message + message <- paste0( + "Found ", + num_results, + " record(s) matching your search." + ) + + if (!deduplicate) { + message <- paste0( + message, "\n", + "Note, there may be >1 version of the same record." + ) + } + + # Print Message + message(message) + } else { + message("No records found matching your search.") + } +} diff --git a/R/mx_snapshot.R b/R/mx_snapshot.R new file mode 100644 index 0000000..c6a8764 --- /dev/null +++ b/R/mx_snapshot.R @@ -0,0 +1,36 @@ +#' Access a static snapshot of the medRxiv repository +#' +#' @description [Available for medRxiv only] Rather than downloading a copy of +#' the medRxiv database from the API, which can become unavailable at peak +#' usage times, this allows users to import a maintained static snapshot of +#' the medRxiv repository. +#' +#' @param commit Commit hash for the snapshot, taken from +#' https://github.com/mcguinlu/medrxivr-data. Allows for reproducible +#' searching by specifying the exact snapshot used to perform the searches. +#' Defaults to "master", which will return the most recent snapshot. +#' +#' @return Formatted dataframe +#' @export +#' @family data-source +#' @examples +#' \donttest{ +#' mx_data <- mx_snapshot() +#' } +#' +mx_snapshot <- function(commit = "master") { + mx_info(commit) + + mx_data <- suppressMessages(data.table::fread( + paste0( + "https://raw.githubusercontent.com/", + "/mcguinlu/medrxivr-data/", commit, "/snapshot.csv" + ), + showProgress = FALSE + )) + + mx_data$link_page <- paste0("https://www.medrxiv.org", mx_data$link) + mx_data$link_pdf <- paste0("https://www.medrxiv.org", mx_data$pdf) + + mx_data +} diff --git a/R/mx_syntax.R b/R/mx_syntax.R new file mode 100644 index 0000000..8e5bad6 --- /dev/null +++ b/R/mx_syntax.R @@ -0,0 +1,125 @@ +#' Search term wrapper that allows for different capitalization of term +#' +#' @description Inspired by the varying capitalization of "NCOV" during the +#' corona virus pandemic (e.g. ncov, nCoV, NCOV, nCOV), this function allows +#' for all possible configurations of lower- and upper-case letters in your +#' search term. +#' +#' @param x Search term to be formatted +#' +#' @return The input string is return, but with each non-space character +#' repeated in lower- and upper-case, and enclosed in square brackets. For +#' example, mx_caps("ncov") returns "[Nn][Cc][Oo][Vv]" +#' @export +#' @family helper +#' +#' @examples +#' \donttest{ +#' +#' query <- c("coronavirus", mx_caps("ncov")) +#' +#' mx_search(mx_snapshot("6c4056d2cccd6031d92ee4269b1785c6ec4d555b"), query) +#' } +#' +mx_caps <- function(x) { + x_v <- stringr::str_to_lower(x) |> + stringr::str_split(stringr::boundary()) |> + unlist() + + for (position in 1:nchar(x)) { + if (x_v[position] == " ") { + next + } + x_v[position] <- paste0("[", stringr::str_to_upper(x_v[position]), x_v[position], "]") + } + + x_v <- paste0(x_v, collapse = "") + + return(x_v) +} + +#' Allow for capitalisation of search terms +#' +#' @param x Search query to be formatted. Note, any search term already +#' containing a square bracket will not be reformatted to preserve +#' user-defined regexes. +#' +#' @return The same list or vector search terms, but with proper regular +#' expression syntax to allow for capitalisation of the first letter of each +#' term. +#' @keywords internal + +fix_caps <- function(x) { + x_clean <- lapply(x, function(y) { + purrr::map_chr(y, function(z) { + # Stop if first character in string is square-brackets + if (grepl("\\[", substr(z, 1, 1)) == TRUE) { + return(z) + } + + z_v <- stringr::str_squish(z) %>% + lapply(function(z) { + paste0( + "[", + toupper(substr(z, 1, 1)), + tolower(substr(z, 1, 1)), + "]", + substr(z, 2, nchar(z)) + ) + }) %>% + unlist() + + return(z_v) + }) + }) + + if (!is.list(x)) { + x_clean <- unlist(x_clean) + } + + return(x_clean) +} + + +#' Replace user-friendly 'wildcard' operator with appropriate regex syntax +#' +#' @param x Search query to be reformatted +#' +#' @keywords internal + +fix_wildcard <- function(x) { + x_clean <- lapply(x, function(y) { + purrr::map_chr(y, function(z) { + stringr::str_replace_all(z, "\\*", "([[:alpha:]])") + }) + }) + + if (!is.list(x)) { + x_clean <- unlist(x_clean) + } + + + return(x_clean) +} + + +#' Replace user-friendly 'NEAR' operator with appropriate regex syntax +#' +#' @param x Search query to be reformatted +#' +#' @keywords internal + +fix_near <- function(x) { + x_clean <- lapply(x, function(y) { + purrr::map_chr(y, function(z) { + stringr::str_replace_all(z, "\\s?[Nn][Ee][Aa][Rr](\\d)\\s?", "NEAR\\1") %>% + stringr::str_replace_all("NEAR(\\d)", "(\\\\s+)([[:graph:]]+\\\\s+){0,\\1}") + }) + }) + + if (!is.list(x)) { + x_clean <- unlist(x_clean) + } + + return(x_clean) +} diff --git a/README.Rmd b/README.Rmd new file mode 100644 index 0000000..07a80e0 --- /dev/null +++ b/README.Rmd @@ -0,0 +1,185 @@ +--- +output: github_document +--- + + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + eval = FALSE, + message = FALSE, + warning = FALSE, + comment = "#>", + fig.path = "man/figures/README-", + out.width = "100%" +) + +library(medrxivr) +``` + +# medrxivr + + + +[![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) +[![rOpenSci Badge](https://badges.ropensci.org/380_status.svg)](https://github.com/ropensci/software-review/issues/380) +[![DOI](https://joss.theoj.org/papers/10.21105/joss.02651/status.svg)](https://doi.org/10.21105/joss.02651) +[![CRAN Downloads.](https://cranlogs.r-pkg.org/badges/grand-total/medrxivr)](https://CRAN.R-project.org/package=medrxivr) +
+[![R build status](https://github.com/ropensci/medrxivr/workflows/R-CMD-check/badge.svg)](https://github.com/ropensci/medrxivr/actions) +[![Codecov test coverage](https://codecov.io/gh/ropensci/medrxivr/branch/master/graph/badge.svg)](https://codecov.io/gh/ropensci/medrxivr?branch=master) + + + +An increasingly important source of health-related bibliographic content are preprints - preliminary versions of research articles that have yet to undergo peer review. The two preprint repositories most relevant to health-related sciences are [medRxiv](https://www.medrxiv.org/) and [bioRxiv](https://www.biorxiv.org/), both of which are operated by the Cold Spring Harbor Laboratory. + +The goal of the `medrxivr` R package is two-fold. In the first instance, it provides programmatic access to the [Cold Spring Harbour Laboratory (CSHL) API](https://api.biorxiv.org/), allowing users to easily download medRxiv and bioRxiv preprint metadata (e.g. title, abstract, publication date, author list, etc) into R. The package also provides access to a maintained static snapshot of the medRxiv repository (see [Data sources](#medrxiv-data)). Secondly, `medrxivr` provides functions to search the downloaded preprint records using regular expressions and Boolean logic, as well as helper functions that allow users to export their search results to a .BIB file for easy import to a reference manager and to download the full-text PDFs of preprints matching their search criteria. + +## Installation + + +To install the stable version of the package from CRAN: + +``` {r} +install.packages("medrxivr") +library(medrxivr) +``` + +Alternatively, to install the development version from GitHub, use the following code: + +``` {r} +install.packages("devtools") +devtools::install_github("ropensci/medrxivr") +library(medrxivr) +``` + +## Data sources + +### medRxiv data + +`medrixvr` provides two ways to access medRxiv data: + + - `mx_api_content(server = "medrxiv")` creates a local copy of all data available from the medRxiv API at the time the function is run. + +``` {r} +# Get a copy of the database from the live medRxiv API endpoint +preprint_data <- mx_api_content() +``` + + - `mx_snapshot()` provides access to a static snapshot of the medRxiv database. The snapshot is created each morning at 6am using `mx_api_content()` and is stored as CSV file in the [medrxivr-data repository](https://github.com/mcguinlu/medrxivr-data). This method does not rely on the API (which can become unavailable during peak usage times) and is usually faster (as it reads data from a CSV rather than having to re-extract it from the API). Discrepancies between the most recent static snapshot and the live database can be assessed using `mx_crosscheck()`. + +``` {r} +# Get a copy of the database from the daily snapshot +preprint_data <- mx_snapshot() +``` + +The relationship between the two methods for the medRxiv database is summarised in the figure below: + +``` {r eval = TRUE, echo = FALSE, out.width = "500px", out.height = "400px"} + +knitr::include_graphics("vignettes/data_sources.png") +``` + +### bioRxiv data + +Only one data source exists for the bioRxiv repository: + + - `mx_api_content(server = "biorxiv")` creates a local copy of all data available from the bioRxiv API endpoint at the time the function is run. __Note__: due to it's size, downloading a complete copy of the bioRxiv repository in this manner takes a long time (~ 1 hour). + +``` {r} +# Get a copy of the database from the live bioRxiv API endpoint +preprint_data <- mx_api_content(server = "biorxiv") +``` + +## Performing your search + +Once you have created a local copy of either the medRxiv or bioRxiv preprint database, you can pass this object (`preprint_data` in the examples above) to `mx_search()` to search the preprint records using an advanced search strategy. + +``` {r, eval = TRUE, message = TRUE} +# Import the medrxiv database +preprint_data <- mx_snapshot() + +# Perform a simple search +results <- mx_search(data = preprint_data, + query ="dementia") + +# Perform an advanced search +topic1 <- c("dementia","vascular","alzheimer's") # Combined with Boolean OR +topic2 <- c("lipids","statins","cholesterol") # Combined with Boolean OR +myquery <- list(topic1, topic2) # Combined with Boolean AND + +results <- mx_search(data = preprint_data, + query = myquery) + +``` + +You can also explore which search terms are contributing most to your search by setting `report = TRUE`: + +```{r, eval = TRUE, message = TRUE} +results <- mx_search(data = preprint_data, + query = myquery, + report = TRUE) +``` + +## Further functionality + +### Export records identified by your search to a .BIB file + +Pass the results of your search above (the `results` object) to the `mx_export()` to export references for preprints matching your search results to a .BIB file so that they can be easily imported into a reference manager (e.g. Zotero, Mendeley). + +```{r, eval = FALSE} +mx_export(data = results, + file = "mx_search_results.bib") + +``` + +### Download PDFs for records returned by your search + +Pass the results of your search above (the `results` object) to the `mx_download()` function to download a copy of the PDF for each record found by your search. + +```{r} +mx_download(results, # Object returned by mx_search(), above + "pdf/", # Directory to save PDFs to + create = TRUE) # Create the directory if it doesn't exist + +``` + +## Accessing the raw API data + +By default, the `mx_api_*()` functions clean the data returned by the API for use with other `medrxivr` functions. + +To access the raw data returned by the API, the `clean` argument should set to `FALSE`: + +``` {r} +mx_api_content(to_date = "2019-07-01", clean = FALSE) + +``` + +See [this article](https://docs.ropensci.org/medrxivr/articles/medrxiv-api.html#accessing-the-raw-api-data) for more details. + +## Detailed guidance + +Detailed guidance, including advice on how to design complex search strategies, is available on the [`medrxivr` website.](https://docs.ropensci.org/medrxivr/) + +## Linked repositories + +See here for the [code used to take the daily snapshot](https://github.com/mcguinlu/medrxivr-data) and [the code that powers the `medrxivr` web app](https://github.com/mcguinlu/medrxivr-app). + +## Other tools/packages for working with medRxiv/bioRxiv data + +The focus of `medrxivr` is on providing tools to allow users to import and then search medRxiv and bioRxiv data. Below are a list of complementary packages that provide distinct but related functionality when working with medRxiv and bioRxiv data: + +* [`rbiorxiv`](https://github.com/nicholasmfraser/rbiorxiv) by [Nicholas Fraser](https://github.com/nicholasmfraser) provides access to the same medRxiv and bioRxiv _content_ data as `medrxivr`, but also provides access to the _usage_ data (e.g. downloads per month) that the Cold Spring Harbour Laboratory API offers. This is useful if you wish to explore, for example, [how the number of PDF downloads from bioRxiv has grown over time.](https://github.com/nicholasmfraser/rbiorxiv#pdf-downloads-over-time) + +## Code of conduct + +Please note that this package is released with a [Contributor +Code of Conduct](https://ropensci.org/code-of-conduct/). +By +contributing to this project, you agree to abide by its terms. + +## Disclaimer + +This package and the data it accesses/returns are provided "as is", with no guarantee of accuracy. Please be sure to check the accuracy of the data yourself (and do let me know if you find an issue so I can fix it for everyone!) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e9fa850 --- /dev/null +++ b/README.md @@ -0,0 +1,236 @@ + + + +# medrxivr + + + +[![Project Status: Active – The project has reached a stable, usable +state and is being actively +developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) +[![rOpenSci +Badge](https://badges.ropensci.org/380_status.svg)](https://github.com/ropensci/software-review/issues/380) +[![DOI](https://joss.theoj.org/papers/10.21105/joss.02651/status.svg)](https://doi.org/10.21105/joss.02651) +[![CRAN +Downloads.](https://cranlogs.r-pkg.org/badges/grand-total/medrxivr)](https://CRAN.R-project.org/package=medrxivr) +
[![R build +status](https://github.com/ropensci/medrxivr/workflows/R-CMD-check/badge.svg)](https://github.com/ropensci/medrxivr/actions) +[![Codecov test +coverage](https://codecov.io/gh/ropensci/medrxivr/branch/master/graph/badge.svg)](https://codecov.io/gh/ropensci/medrxivr?branch=master) + + + +An increasingly important source of health-related bibliographic content +are preprints - preliminary versions of research articles that have yet +to undergo peer review. The two preprint repositories most relevant to +health-related sciences are [medRxiv](https://www.medrxiv.org/) and +[bioRxiv](https://www.biorxiv.org/), both of which are operated by the +Cold Spring Harbor Laboratory. + +The goal of the `medrxivr` R package is two-fold. In the first instance, +it provides programmatic access to the [Cold Spring Harbour Laboratory +(CSHL) API](https://api.biorxiv.org/), allowing users to easily download +medRxiv and bioRxiv preprint metadata (e.g. title, abstract, publication +date, author list, etc) into R. The package also provides access to a +maintained static snapshot of the medRxiv repository (see [Data +sources](#medrxiv-data)). Secondly, `medrxivr` provides functions to +search the downloaded preprint records using regular expressions and +Boolean logic, as well as helper functions that allow users to export +their search results to a .BIB file for easy import to a reference +manager and to download the full-text PDFs of preprints matching their +search criteria. + +## Installation + +To install the stable version of the package from CRAN: + +``` r +install.packages("medrxivr") +library(medrxivr) +``` + +Alternatively, to install the development version from GitHub, use the +following code: + +``` r +install.packages("devtools") +devtools::install_github("ropensci/medrxivr") +library(medrxivr) +``` + +## Data sources + +### medRxiv data + +`medrixvr` provides two ways to access medRxiv data: + +- `mx_api_content(server = "medrxiv")` creates a local copy of all data + available from the medRxiv API at the time the function is run. + +``` r +# Get a copy of the database from the live medRxiv API endpoint +preprint_data <- mx_api_content() +``` + +- `mx_snapshot()` provides access to a static snapshot of the medRxiv + database. The snapshot is created each morning at 6am using + `mx_api_content()` and is stored as CSV file in the [medrxivr-data + repository](https://github.com/mcguinlu/medrxivr-data). This method + does not rely on the API (which can become unavailable during peak + usage times) and is usually faster (as it reads data from a CSV rather + than having to re-extract it from the API). Discrepancies between the + most recent static snapshot and the live database can be assessed + using `mx_crosscheck()`. + +``` r +# Get a copy of the database from the daily snapshot +preprint_data <- mx_snapshot() +``` + +The relationship between the two methods for the medRxiv database is +summarised in the figure below: + + + +### bioRxiv data + +Only one data source exists for the bioRxiv repository: + +- `mx_api_content(server = "biorxiv")` creates a local copy of all data + available from the bioRxiv API endpoint at the time the function is + run. **Note**: due to it’s size, downloading a complete copy of the + bioRxiv repository in this manner takes a long time (~ 1 hour). + +``` r +# Get a copy of the database from the live bioRxiv API endpoint +preprint_data <- mx_api_content(server = "biorxiv") +``` + +## Performing your search + +Once you have created a local copy of either the medRxiv or bioRxiv +preprint database, you can pass this object (`preprint_data` in the +examples above) to `mx_search()` to search the preprint records using an +advanced search strategy. + +``` r +# Import the medrxiv database +preprint_data <- mx_snapshot() +#> Using medRxiv snapshot - 2022-07-06 01:09 + +# Perform a simple search +results <- mx_search(data = preprint_data, + query ="dementia") +#> Found 427 record(s) matching your search. + +# Perform an advanced search +topic1 <- c("dementia","vascular","alzheimer's") # Combined with Boolean OR +topic2 <- c("lipids","statins","cholesterol") # Combined with Boolean OR +myquery <- list(topic1, topic2) # Combined with Boolean AND + +results <- mx_search(data = preprint_data, + query = myquery) +#> Found 143 record(s) matching your search. +``` + +You can also explore which search terms are contributing most to your +search by setting `report = TRUE`: + +``` r +results <- mx_search(data = preprint_data, + query = myquery, + report = TRUE) +#> Found 143 record(s) matching your search. +#> Total topic 1 records: 2272 +#> dementia: 427 +#> vascular: 1918 +#> alzheimer's: 0 +#> Total topic 2 records: 410 +#> lipids: 157 +#> statins: 61 +#> cholesterol: 255 +``` + +## Further functionality + +### Export records identified by your search to a .BIB file + +Pass the results of your search above (the `results` object) to the +`mx_export()` to export references for preprints matching your search +results to a .BIB file so that they can be easily imported into a +reference manager (e.g. Zotero, Mendeley). + +``` r +mx_export(data = results, + file = "mx_search_results.bib") +``` + +### Download PDFs for records returned by your search + +Pass the results of your search above (the `results` object) to the +`mx_download()` function to download a copy of the PDF for each record +found by your search. + +``` r +mx_download(results, # Object returned by mx_search(), above + "pdf/", # Directory to save PDFs to + create = TRUE) # Create the directory if it doesn't exist +``` + +## Accessing the raw API data + +By default, the `mx_api_*()` functions clean the data returned by the +API for use with other `medrxivr` functions. + +To access the raw data returned by the API, the `clean` argument should +set to `FALSE`: + +``` r +mx_api_content(to_date = "2019-07-01", clean = FALSE) +``` + +See [this +article](https://docs.ropensci.org/medrxivr/articles/medrxiv-api.html#accessing-the-raw-api-data) +for more details. + +## Detailed guidance + +Detailed guidance, including advice on how to design complex search +strategies, is available on the [`medrxivr` +website.](https://docs.ropensci.org/medrxivr/) + +## Linked repositories + +See here for the [code used to take the daily +snapshot](https://github.com/mcguinlu/medrxivr-data) and [the code that +powers the `medrxivr` web +app](https://github.com/mcguinlu/medrxivr-app). + +## Other tools/packages for working with medRxiv/bioRxiv data + +The focus of `medrxivr` is on providing tools to allow users to import +and then search medRxiv and bioRxiv data. Below are a list of +complementary packages that provide distinct but related functionality +when working with medRxiv and bioRxiv data: + +- [`rbiorxiv`](https://github.com/nicholasmfraser/rbiorxiv) by [Nicholas + Fraser](https://github.com/nicholasmfraser) provides access to the + same medRxiv and bioRxiv *content* data as `medrxivr`, but also + provides access to the *usage* data (e.g. downloads per month) that + the Cold Spring Harbour Laboratory API offers. This is useful if you + wish to explore, for example, [how the number of PDF downloads from + bioRxiv has grown over + time.](https://github.com/nicholasmfraser/rbiorxiv#pdf-downloads-over-time) + +## Code of conduct + +Please note that this package is released with a [Contributor Code of +Conduct](https://ropensci.org/code-of-conduct/). By contributing to this +project, you agree to abide by its terms. + +## Disclaimer + +This package and the data it accesses/returns are provided “as is”, with +no guarantee of accuracy. Please be sure to check the accuracy of the +data yourself (and do let me know if you find an issue so I can fix it +for everyone!) diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..8878f4d --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,11 @@ +destination: docs +reference: +- title: Accessing medRxiv/bioRxiv data + contents: + - has_concept("data-source") +- title: Performing the search + contents: + - has_concept("main") +- title: Helper functions + contents: + - has_concept("helper") diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..8c6621c --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,51 @@ +# DO NOT CHANGE the "init" and "install" sections below + +# Download script file from GitHub +init: + ps: | + $ErrorActionPreference = "Stop" + Invoke-WebRequest http://raw.github.com/krlmlr/r-appveyor/master/scripts/appveyor-tool.ps1 -OutFile "..\appveyor-tool.ps1" + Import-Module '..\appveyor-tool.ps1' +install: + ps: Bootstrap + +cache: + - C:\RLibrary + +environment: + NOT_CRAN: true + # env vars that may need to be set, at least temporarily, from time to time + # see https://github.com/krlmlr/r-appveyor#readme for details + # USE_RTOOLS: true + # R_REMOTES_STANDALONE: true + +# Adapt as necessary starting from here + +build_script: + - travis-tool.sh install_deps + +test_script: + - travis-tool.sh run_tests + +on_failure: + - 7z a failure.zip *.Rcheck\* + - appveyor PushArtifact failure.zip + +artifacts: + - path: '*.Rcheck\**\*.log' + name: Logs + + - path: '*.Rcheck\**\*.out' + name: Logs + + - path: '*.Rcheck\**\*.fail' + name: Logs + + - path: '*.Rcheck\**\*.Rout' + name: Logs + + - path: '\*_*.tar.gz' + name: Bits + + - path: '\*_*.zip' + name: Bits diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..8f36b6c --- /dev/null +++ b/codecov.yml @@ -0,0 +1,12 @@ +comment: false + +coverage: + status: + project: + default: + target: auto + threshold: 1% + patch: + default: + target: auto + threshold: 1% diff --git a/codemeta.json b/codemeta.json new file mode 100644 index 0000000..2f63abc --- /dev/null +++ b/codemeta.json @@ -0,0 +1,324 @@ +{ + "@context": [ + "https://doi.org/10.5063/schema/codemeta-2.0", + "http://schema.org" + ], + "@type": "SoftwareSourceCode", + "identifier": "medrxivr", + "description": "An increasingly important source of health-related bibliographic \n content are preprints - preliminary versions of research articles that have\n yet to undergo peer review. The two preprint repositories most relevant to \n health-related sciences are medRxiv and\n bioRxiv , both of which are operated by the Cold \n Spring Harbor Laboratory. 'medrxivr' provides programmatic access to the \n 'Cold Spring Harbour Laboratory (CSHL)' API ,\n allowing users to easily download medRxiv and bioRxiv preprint metadata\n (e.g. title, abstract, publication date, author list, etc) into R. \n 'medrxivr' also provides functions to search the downloaded preprint records \n using regular expressions and Boolean logic, as well as helper functions \n that allow users to export their search results to a .BIB file for easy \n import to a reference manager and to download the full-text PDFs of \n preprints matching their search criteria.", + "name": "medrxivr: Access and Search MedRxiv and BioRxiv Preprint Data", + "codeRepository": "https://github.com/ropensci/medrxivr", + "issueTracker": "https://github.com/ropensci/medrxivr/issues", + "license": "https://spdx.org/licenses/MIT", + "version": "0.0.4", + "programmingLanguage": { + "@type": "ComputerLanguage", + "name": "R", + "url": "https://r-project.org" + }, + "runtimePlatform": "R version 3.6.1 (2019-07-05)", + "author": [ + { + "@type": "Person", + "givenName": "Luke", + "familyName": "McGuinness", + "email": "luke.mcguinness@bristol.ac.uk", + "@id": "https://orcid.org/0000-0001-8730-9761" + }, + { + "@type": "Person", + "givenName": "Lena", + "familyName": "Schmidt", + "@id": "https://orcid.org/0000-0003-0709-8226" + } + ], + "contributor": {}, + "copyrightHolder": {}, + "funder": {}, + "maintainer": [ + { + "@type": "Person", + "givenName": "Luke", + "familyName": "McGuinness", + "email": "luke.mcguinness@bristol.ac.uk", + "@id": "https://orcid.org/0000-0001-8730-9761" + } + ], + "softwareSuggestions": [ + { + "@type": "SoftwareApplication", + "identifier": "testthat", + "name": "testthat", + "version": ">= 2.1.0", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=testthat" + }, + { + "@type": "SoftwareApplication", + "identifier": "knitr", + "name": "knitr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=knitr" + }, + { + "@type": "SoftwareApplication", + "identifier": "rmarkdown", + "name": "rmarkdown", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=rmarkdown" + }, + { + "@type": "SoftwareApplication", + "identifier": "covr", + "name": "covr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=covr" + }, + { + "@type": "SoftwareApplication", + "identifier": "kableExtra", + "name": "kableExtra", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=kableExtra" + }, + { + "@type": "SoftwareApplication", + "identifier": "spelling", + "name": "spelling", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=spelling" + } + ], + "softwareRequirements": [ + { + "@type": "SoftwareApplication", + "identifier": "methods", + "name": "methods" + }, + { + "@type": "SoftwareApplication", + "identifier": "dplyr", + "name": "dplyr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=dplyr" + }, + { + "@type": "SoftwareApplication", + "identifier": "curl", + "name": "curl", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=curl" + }, + { + "@type": "SoftwareApplication", + "identifier": "jsonlite", + "name": "jsonlite", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=jsonlite" + }, + { + "@type": "SoftwareApplication", + "identifier": "httr", + "name": "httr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=httr" + }, + { + "@type": "SoftwareApplication", + "identifier": "stringr", + "name": "stringr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=stringr" + }, + { + "@type": "SoftwareApplication", + "identifier": "rlang", + "name": "rlang", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=rlang" + }, + { + "@type": "SoftwareApplication", + "identifier": "vroom", + "name": "vroom", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=vroom" + }, + { + "@type": "SoftwareApplication", + "identifier": "bib2df", + "name": "bib2df", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=bib2df" + }, + { + "@type": "SoftwareApplication", + "identifier": "tibble", + "name": "tibble", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=tibble" + }, + { + "@type": "SoftwareApplication", + "identifier": "progress", + "name": "progress", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=progress" + }, + { + "@type": "SoftwareApplication", + "identifier": "lubridate", + "name": "lubridate", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=lubridate" + } + ], + "releaseNotes": "https://github.com/ropensci/medrxivr/blob/master/NEWS.md", + "readme": "https://github.com/ropensci/medrxivr/blob/master/README.md", + "fileSize": "1425.236KB", + "contIntegration": ["https://travis-ci.com/ropensci/medrxivr", "https://codecov.io/gh/ropensci/medrxivr?branch=master"], + "developmentStatus": "https://www.repostatus.org/#active", + "review": { + "@type": "Review", + "url": "https://github.com/ropensci/software-review/issues/380", + "provider": "https://ropensci.org" + }, + "keywords": [ + "evidence-synthesis", + "systematic-reviews", + "bibliographic-database", + "rstats", + "r-package", + "r", + "preprint-records", + "medrxiv-data", + "biorxiv", + "peer-reviewed" + ], + "citation": [ + { + "@type": "ScholarlyArticle", + "datePublished": "2020", + "author": [ + { + "@type": "Person", + "givenName": ["Luke", "A."], + "familyName": "McGuinness" + }, + { + "@type": "Person", + "givenName": "Lena", + "familyName": "Schmidt" + } + ], + "name": "medrxivr: Accessing and searching medRxiv and bioRxiv preprint data in R", + "identifier": "10.21105/joss.02651", + "url": "https://doi.org/10.21105/joss.02651", + "pagination": "2651", + "@id": "https://doi.org/10.21105/joss.02651", + "sameAs": "https://doi.org/10.21105/joss.02651", + "isPartOf": { + "@type": "PublicationIssue", + "issueNumber": "54", + "datePublished": "2020", + "isPartOf": { + "@type": ["PublicationVolume", "Periodical"], + "volumeNumber": "5", + "name": "Journal of Open Source Software" + } + } + } + ], + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "relatedLink": "https://CRAN.R-project.org/package=medrxivr" +} diff --git a/inst/CITATION b/inst/CITATION new file mode 100644 index 0000000..7370770 --- /dev/null +++ b/inst/CITATION @@ -0,0 +1,22 @@ +citHeader("To cite medrxivr in publications use:") + +citEntry( + entry = "Article", + title = + "medrxivr: Accessing and searching medRxiv and bioRxiv preprint data in R", + author = "Luke A. McGuinness and Lena Schmidt", + journal = "Journal of Open Source Software", + year = "2020", + volume = "5", + number = "54", + pages = "2651", + doi = "10.21105/joss.02651", + url = "https://doi.org/10.21105/joss.02651", + + textVersion = paste( + "Luke A. McGuinness & Lena Schmidt (2020).", + "medrxivr: Accessing and searching medRxiv and bioRxiv preprint data in R.", + "Journal of Open Source Software, 5(54), 2651.", + "https://doi.org/10.21105/joss.02651" + ) +) diff --git a/inst/WORDLIST b/inst/WORDLIST new file mode 100644 index 0000000..cd6fb97 --- /dev/null +++ b/inst/WORDLIST @@ -0,0 +1,57 @@ +BioRxiv +CSHL +Capitalisation +Codecov +DOI +Harbour +JOSS +MedRxiv +Mendeley +NCOV +Ncov +Nn +O'Hare +ORCID +Oo +PDF's +Preprint +Spannbauer +Vv +YYYY +Zotero +api +ation +bioRxiv +biorxiv +capitalisation +capitalise +capitalised +coronavirus +doi +dontrun +donttest +ementia +ered +filespace +github +https +mcguinlu +medRxiv +medrxiv +mx +nCOV +nCoV +ncov +onboarded +preprint +preprints +rOpenSci +randomi +randomisation +regexes +summarised +tempdir +tempfile +tibbles +uncapitalised +ungrouped diff --git a/inst/paper.bib b/inst/paper.bib new file mode 100644 index 0000000..1e39f0b --- /dev/null +++ b/inst/paper.bib @@ -0,0 +1,28 @@ + +@article{Brierley, + title = {The Role of Research Preprints in the Academic Response to the {{COVID}}-19 Epidemic}, + author = {Brierley, Liam}, + year = {2020}, + publisher = {{Authorea, Inc.}}, + doi = {10.22541/au.158516578.89167184}, + journal = {Authorea} +} + +@article{rawlinson2019, + title = {New Preprint Server for Medical Research}, + author = {Rawlinson, Claire and Bloom, Theodora}, + year = {2019}, + volume = {365}, + publisher = {{British Medical Journal Publishing Group}}, + issn = {0959-8138, 1756-1833}, + doi = {10.1136/bmj.l2301}, + abstract = {{$<$}p{$>$}Announcing the launch of medRxiv for faster access to better evidence{$<$}/p{$>$}}, + chapter = {Editorial}, + copyright = {Published by the BMJ Publishing Group Limited. For permission to use (where not already granted under a licence) please go to http://group.bmj.com/group/rights-licensing/permissions}, + file = {C\:\\Users\\lm16564\\Zotero\\storage\\C643I5RI\\Rawlinson and Bloom - 2019 - New preprint server for medical research.pdf;C\:\\Users\\lm16564\\Zotero\\storage\\FDGFMIUQ\\bmj.html}, + journal = {BMJ}, + language = {en}, + pmid = {31167753} +} + + diff --git a/inst/paper.md b/inst/paper.md new file mode 100644 index 0000000..2d0aa49 --- /dev/null +++ b/inst/paper.md @@ -0,0 +1,36 @@ +--- +title: 'medrxivr: Accessing and searching medRxiv and bioRxiv preprint data in R' +tags: + - R + - systematic review + - evidence synthesis + - bibliographic database +authors: + - name: Luke A McGuinness + orcid: 0000-0003-0872-7098 + affiliation: "1, 2" + - name: Lena Schmidt + orcid: 0000-0003-0709-8226 + affiliation: 1 +affiliations: + - name: Department of Population Health Science, University of Bristol + index: 1 + - name: MRC Intergrative Epidemiology Unit, University of Bristol + index: 2 +date: 11 August 2020 +bibliography: paper.bib +--- + +# Summary + +An increasingly important source of health-related bibliographic content are preprints: preliminary versions of research articles that have yet to undergo peer review. The two preprint repositories most relevant to health-related sciences are [medRxiv](https://www.medrxiv.org) and [bioRxiv](https://www.biorxiv.org), both of which are operated by the Cold Spring Harbor Laboratory, a not-for-profit research and educational institution [@rawlinson2019]. + +The goal of the `medrxivr` R package is two-fold. In the first instance, it provides programmatic access to the Cold Spring Harbour Laboratory (CSHL) API, allowing users to download medRxiv and bioRxiv preprint metadata (e.g., title, abstract, author list.) This functionality will be of interest to anyone who wishes to import medRxiv and/or bioRxiv preprint metadata into R, for example to explore the distribution of preprints by subject area or by publication year. Examples of this type of usage have already been reported [e.g., by @Brierley]. + +In the second instance, the package provides functions that allow users to search the downloaded preprint metadata for relevant preprints using complex search strings, including functionality such as search term truncation, Boolean operators (AND, OR, NOT), and term proximity. Helper functions are provided that allow users to export the results of their search to a .bib file for import into a reference manager (e.g., Zotero) and to download the full-text PDFs of preprints matching their search. This aspect of the package will be more relevant to systematic reviewers, health librarians and others performing literature searches, allowing them to perform and document transparent and reproducible searches in these important evidence sources. + +# Acknowledgements + +We acknowledge funding from NIHR (LAM through NIHR Doctoral Research Fellowship (DRF-2018-11-ST2-048), and LS through NIHR Systematic Reviews Fellowship (RM-SR-2017-09-028)). LAM is a member of the MRC Integrative Epidemiology Unit at the University of Bristol. The views expressed in this article are those of the authors and do not necessarily represent those of the NHS, the NIHR, MRC, or the Department of Health and Social Care. + +# References diff --git a/man/api_link.Rd b/man/api_link.Rd new file mode 100644 index 0000000..166f04b --- /dev/null +++ b/man/api_link.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helpers.R +\name{api_link} +\alias{api_link} +\title{Create link for API} +\usage{ +api_link(...) +} +\arguments{ +\item{...}{Arguments to specify the path to the API endpoint} +} +\value{ +Formatted link to API endpoint +} +\description{ +Create link for API +} +\keyword{internal} diff --git a/man/api_to_df.Rd b/man/api_to_df.Rd new file mode 100644 index 0000000..85284d2 --- /dev/null +++ b/man/api_to_df.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helpers.R +\name{api_to_df} +\alias{api_to_df} +\title{Convert API data to data frame} +\usage{ +api_to_df(url) +} +\arguments{ +\item{url}{API endpoint from which to extract and format data} +} +\value{ +Raw API data in a dataframe +} +\description{ +Convert API data to data frame +} +\keyword{internal} diff --git a/man/clean_api_df.Rd b/man/clean_api_df.Rd new file mode 100644 index 0000000..9feb89b --- /dev/null +++ b/man/clean_api_df.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helpers.R +\name{clean_api_df} +\alias{clean_api_df} +\title{Helper script to clean data from API to make it compatible with mx_search()} +\usage{ +clean_api_df(df) +} +\arguments{ +\item{df}{Raw dataframe from API} +} +\value{ +Cleaned dataframe +} +\description{ +Helper script to clean data from API to make it compatible with mx_search() +} +\keyword{internal} diff --git a/man/figures/hex-medrxivr-wide.png b/man/figures/hex-medrxivr-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..57be428c5874311ac0f220afe3b309928864f800 GIT binary patch literal 19645 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 lYi-Rf_kX$T|4*b73kQ7{y)qf8M6QY literal 0 HcmV?d00001 diff --git a/man/figures/logo.png b/man/figures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0140713d361fc43bff488263dced4abc167efa90 GIT binary patch literal 24237 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 RL+}BLi<5_ADcAqte*yUOYasvt literal 0 HcmV?d00001 diff --git a/man/fix_caps.Rd b/man/fix_caps.Rd new file mode 100644 index 0000000..3f5ddbb --- /dev/null +++ b/man/fix_caps.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_syntax.R +\name{fix_caps} +\alias{fix_caps} +\title{Allow for capitalisation of search terms} +\usage{ +fix_caps(x) +} +\arguments{ +\item{x}{Search query to be formatted. Note, any search term already +containing a square bracket will not be reformatted to preserve +user-defined regexes.} +} +\value{ +The same list or vector search terms, but with proper regular + expression syntax to allow for capitalisation of the first letter of each + term. +} +\description{ +Allow for capitalisation of search terms +} +\keyword{internal} diff --git a/man/fix_near.Rd b/man/fix_near.Rd new file mode 100644 index 0000000..4d8feea --- /dev/null +++ b/man/fix_near.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_syntax.R +\name{fix_near} +\alias{fix_near} +\title{Replace user-friendly 'NEAR' operator with appropriate regex syntax} +\usage{ +fix_near(x) +} +\arguments{ +\item{x}{Search query to be reformatted} +} +\description{ +Replace user-friendly 'NEAR' operator with appropriate regex syntax +} +\keyword{internal} diff --git a/man/fix_wildcard.Rd b/man/fix_wildcard.Rd new file mode 100644 index 0000000..5f3db9c --- /dev/null +++ b/man/fix_wildcard.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_syntax.R +\name{fix_wildcard} +\alias{fix_wildcard} +\title{Replace user-friendly 'wildcard' operator with appropriate regex syntax} +\usage{ +fix_wildcard(x) +} +\arguments{ +\item{x}{Search query to be reformatted} +} +\description{ +Replace user-friendly 'wildcard' operator with appropriate regex syntax +} +\keyword{internal} diff --git a/man/internet_check.Rd b/man/internet_check.Rd new file mode 100644 index 0000000..f9accd4 --- /dev/null +++ b/man/internet_check.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helpers.R +\name{internet_check} +\alias{internet_check} +\title{Checks whether the user has internet, and returns a helpful message it not.} +\usage{ +internet_check() +} +\value{ +Informative error if not connected to the internet +} +\description{ +Checks whether the user has internet, and returns a helpful message it not. +} +\keyword{internal} diff --git a/man/medrxivr-package.Rd b/man/medrxivr-package.Rd new file mode 100644 index 0000000..019de48 --- /dev/null +++ b/man/medrxivr-package.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/medrxivr-package.R +\docType{package} +\name{medrxivr-package} +\alias{medrxivr} +\alias{medrxivr-package} +\title{medrxivr: Accessing medRxiv and bioRxiv preprint data from R} +\description{ +The medrxivr package enables users to access data on preprints in the medRxiv +and bioRxiv preprints repositories, both of which are run by the Cold Spring +Harbour Laboratory.It also provides functions to search the preprint data, +export it to a .bib file, and download the PDFs associated with specified +records. +} +\seealso{ +Useful links: +\itemize{ + \item \url{https://github.com/ropensci/medrxivr} + \item Report bugs at \url{https://github.com/ropensci/medrxivr/issues} +} + +} +\author{ +\strong{Maintainer}: Yaoxiang Li \email{liyaoxiang@outlook.com} (\href{https://orcid.org/0000-0001-9200-1016}{ORCID}) + +Authors: +\itemize{ + \item Luke McGuinness + \item Lena Schmidt +} + +Other contributors: +\itemize{ + \item Tuija Sonkkila [reviewer] + \item Najko Jahn [reviewer] +} + +} +\keyword{internal} diff --git a/man/mx_api_content.Rd b/man/mx_api_content.Rd new file mode 100644 index 0000000..72fe819 --- /dev/null +++ b/man/mx_api_content.Rd @@ -0,0 +1,58 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_api.R +\name{mx_api_content} +\alias{mx_api_content} +\title{Access medRxiv/bioRxiv data via the Cold Spring Harbour Laboratory API} +\usage{ +mx_api_content( + from_date = "2013-01-01", + to_date = as.character(Sys.Date()), + clean = TRUE, + server = "medrxiv", + include_info = FALSE +) +} +\arguments{ +\item{from_date}{Earliest date of interest, written as "YYYY-MM-DD". Defaults +to 1st Jan 2013 ("2013-01-01"), ~6 months prior to earliest preprint +registration date.} + +\item{to_date}{Latest date of interest, written as "YYYY-MM-DD". Defaults to +current date.} + +\item{clean}{Logical, defaulting to TRUE, indicating whether to clean the +data returned by the API. If TRUE, variables containing absolute paths to +the preprints web-page ("link_page") and PDF ("link_pdf") are generated +from the "server", "DOI", and "version" variables returned by the API. The +"title", "abstract" and "authors" variables are converted to title case. +Finally, the "type" and "server" variables are dropped.} + +\item{server}{Specify the server you wish to use: "medrxiv" (default) or +"biorxiv"} + +\item{include_info}{Logical, indicating whether to include variables +containing information returned by the API (e.g. API status, cursor number, +total count of papers, etc). Default is FALSE.} +} +\value{ +Dataframe with 1 record per row +} +\description{ +Provides programmatic access to all preprints available through + the Cold Spring Harbour Laboratory API, which serves both the medRxiv and + bioRxiv preprint repositories. +} +\examples{ +if (interactive()) { + mx_data <- mx_api_content( + from_date = "2020-01-01", + to_date = "2020-01-07" + ) +} +} +\seealso{ +Other data-source: +\code{\link{mx_api_doi}()}, +\code{\link{mx_snapshot}()} +} +\concept{data-source} diff --git a/man/mx_api_doi.Rd b/man/mx_api_doi.Rd new file mode 100644 index 0000000..f1c265f --- /dev/null +++ b/man/mx_api_doi.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_api.R +\name{mx_api_doi} +\alias{mx_api_doi} +\title{Access data on a single medRxiv/bioRxiv record via the Cold Spring Harbour +Laboratory API} +\usage{ +mx_api_doi(doi, server = "medrxiv", clean = TRUE) +} +\arguments{ +\item{doi}{Digital object identifier of the preprint you wish to retrieve +data on.} + +\item{server}{Specify the server you wish to use: "medrxiv" (default) or +"biorxiv"} + +\item{clean}{Logical, defaulting to TRUE, indicating whether to clean the +data returned by the API. If TRUE, variables containing absolute paths to +the preprints web-page ("link_page") and PDF ("link_pdf") are generated +from the "server", "DOI", and "version" variables returned by the API. The +"title", "abstract" and "authors" variables are converted to title case. +Finally, the "type" and "server" variables are dropped.} +} +\value{ +Dataframe containing details on the preprint identified by the DOI. +} +\description{ +Provides programmatic access to data on a single preprint + identified by a unique Digital Object Identifier (DOI). +} +\examples{ +if (interactive()) { + mx_data <- mx_api_doi("10.1101/2020.02.25.20021568") +} +} +\seealso{ +Other data-source: +\code{\link{mx_api_content}()}, +\code{\link{mx_snapshot}()} +} +\concept{data-source} diff --git a/man/mx_caps.Rd b/man/mx_caps.Rd new file mode 100644 index 0000000..0b349a4 --- /dev/null +++ b/man/mx_caps.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_syntax.R +\name{mx_caps} +\alias{mx_caps} +\title{Search term wrapper that allows for different capitalization of term} +\usage{ +mx_caps(x) +} +\arguments{ +\item{x}{Search term to be formatted} +} +\value{ +The input string is return, but with each non-space character + repeated in lower- and upper-case, and enclosed in square brackets. For + example, mx_caps("ncov") returns "[Nn][Cc][Oo][Vv]" +} +\description{ +Inspired by the varying capitalization of "NCOV" during the + corona virus pandemic (e.g. ncov, nCoV, NCOV, nCOV), this function allows + for all possible configurations of lower- and upper-case letters in your + search term. +} +\examples{ +\donttest{ + +query <- c("coronavirus", mx_caps("ncov")) + +mx_search(mx_snapshot("6c4056d2cccd6031d92ee4269b1785c6ec4d555b"), query) +} + +} +\seealso{ +Other helper: +\code{\link{mx_crosscheck}()}, +\code{\link{mx_download}()}, +\code{\link{mx_export}()} +} +\concept{helper} diff --git a/man/mx_crosscheck.Rd b/man/mx_crosscheck.Rd new file mode 100644 index 0000000..07edde0 --- /dev/null +++ b/man/mx_crosscheck.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_crosscheck.R +\name{mx_crosscheck} +\alias{mx_crosscheck} +\title{Check how up-to-date the maintained medRxiv snapshot is} +\usage{ +mx_crosscheck() +} +\description{ +Provides information on how up-to-date the maintained medRxiv + snapshot provided by `mx_snapshot()` is by checking whether there have been + any records added to, or updated in, the medRxiv repository since the last + snapshot was taken. +} +\examples{ +\donttest{ +mx_crosscheck() +} +} +\seealso{ +Other helper: +\code{\link{mx_caps}()}, +\code{\link{mx_download}()}, +\code{\link{mx_export}()} +} +\concept{helper} diff --git a/man/mx_download.Rd b/man/mx_download.Rd new file mode 100644 index 0000000..ce95c82 --- /dev/null +++ b/man/mx_download.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_download.R +\name{mx_download} +\alias{mx_download} +\title{Download PDF's of preprints returned by a search} +\usage{ +mx_download( + mx_results, + directory, + create = TRUE, + name = c("ID", "DOI"), + print_update = 10 +) +} +\arguments{ +\item{mx_results}{Vector containing the links to the medRxiv PDFs} + +\item{directory}{The location you want to download the PDF's to} + +\item{create}{TRUE or FALSE. If TRUE, creates the directory if it doesn't +exist} + +\item{name}{How to name the downloaded PDF. By default, both the ID number of +the record and the DOI are used.} + +\item{print_update}{How frequently to print an update} +} +\description{ +Download PDF's of all the papers in your search results +} +\examples{ +\donttest{ +mx_results <- mx_search(mx_snapshot(), query = "10.1101/2020.02.25.20021568") +mx_download(mx_results, directory = tempdir()) +} +} +\seealso{ +Other helper: +\code{\link{mx_caps}()}, +\code{\link{mx_crosscheck}()}, +\code{\link{mx_export}()} +} +\concept{helper} diff --git a/man/mx_export.Rd b/man/mx_export.Rd new file mode 100644 index 0000000..2909385 --- /dev/null +++ b/man/mx_export.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_export.R +\name{mx_export} +\alias{mx_export} +\title{Export references for preprints returning by a search to a .bib file} +\usage{ +mx_export(data, file = "medrxiv_export.bib") +} +\arguments{ +\item{data}{Dataframe returned by mx_search() or mx_api_*() functions} + +\item{file}{File location to save to. Must have the .bib file extension} +} +\value{ +Exports a formatted .BIB file, for import into a reference manager +} +\description{ +Export references for preprints returning by a search to a .bib file +} +\examples{ +\donttest{ +mx_results <- mx_search(mx_snapshot(), query = "brain") +mx_export(mx_results, tempfile(fileext = ".bib")) +} + +} +\seealso{ +Other helper: +\code{\link{mx_caps}()}, +\code{\link{mx_crosscheck}()}, +\code{\link{mx_download}()} +} +\concept{helper} diff --git a/man/mx_info.Rd b/man/mx_info.Rd new file mode 100644 index 0000000..81280bb --- /dev/null +++ b/man/mx_info.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_info.R +\name{mx_info} +\alias{mx_info} +\title{Provide information on the medRxiv snapshot used to perform the search} +\usage{ +mx_info(commit = "master") +} +\arguments{ +\item{commit}{Commit hash for the snapshot, taken from +https://github.com/mcguinlu/medrxivr-data. Defaults to "master", which will +return info on the most recent snapshot.} +} +\value{ +Message with snapshot details +} +\description{ +Provide information on the medRxiv snapshot used to perform the search +} +\keyword{internal} diff --git a/man/mx_reporter.Rd b/man/mx_reporter.Rd new file mode 100644 index 0000000..740de9b --- /dev/null +++ b/man/mx_reporter.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_search.R +\name{mx_reporter} +\alias{mx_reporter} +\title{Search and print output for individual search items} +\usage{ +mx_reporter(mx_data, num_results, query, fields, deduplicate, NOT) +} +\arguments{ +\item{mx_data}{The mx_dataset filtered for the date limits} + +\item{num_results}{The number of results returned by the overall search} + +\item{query}{Character string, vector or list} + +\item{fields}{Fields of the database to search - default is Title, Abstract, +Authors, Category, and DOI.} + +\item{deduplicate}{Logical. Only return the most recent version of a record. +Default is TRUE.} + +\item{NOT}{Vector of regular expressions to exclude from the search. Default +is "".} +} +\description{ +Search and print output for individual search items +} +\seealso{ +Other main: +\code{\link{mx_search}()}, +\code{\link{print_full_results}()}, +\code{\link{run_search}()} +} +\concept{main} diff --git a/man/mx_search.Rd b/man/mx_search.Rd new file mode 100644 index 0000000..dda719b --- /dev/null +++ b/man/mx_search.Rd @@ -0,0 +1,68 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_search.R +\name{mx_search} +\alias{mx_search} +\title{Search preprint data} +\usage{ +mx_search( + data = NULL, + query = NULL, + fields = c("title", "abstract", "authors", "category", "doi"), + from_date = NULL, + to_date = NULL, + auto_caps = FALSE, + NOT = "", + deduplicate = TRUE, + report = FALSE +) +} +\arguments{ +\item{data}{The preprint dataset that is to be searched, created either using +mx_api_content() or mx_snapshot()} + +\item{query}{Character string, vector or list} + +\item{fields}{Fields of the database to search - default is Title, Abstract, +Authors, Category, and DOI.} + +\item{from_date}{Defines earliest date of interest. Written in the format +"YYYY-MM-DD". Note, records published on the date specified will also be +returned.} + +\item{to_date}{Defines latest date of interest. Written in the format +"YYYY-MM-DD". Note, records published on the date specified will also be +returned.} + +\item{auto_caps}{As the search is case sensitive, this logical specifies +whether the search should automatically allow for differing capitalisation +of search terms. For example, when TRUE, a search for "dementia" would find +both "dementia" but also "Dementia". Note, that if your term is multi-word +(e.g. "systematic review"), only the first word is automatically +capitalised (e.g your search will find both "systematic review" and +"Systematic review" but won't find "Systematic Review". Note that this +option will format terms in the query and NOT arguments (if applicable).} + +\item{NOT}{Vector of regular expressions to exclude from the search. Default +is "".} + +\item{deduplicate}{Logical. Only return the most recent version of a record. +Default is TRUE.} + +\item{report}{Logical. Run mx_reporter. Default is FALSE.} +} +\description{ +Search preprint data +} +\examples{ +\donttest{ +# Using the daily snapshot +mx_results <- mx_search(data = mx_snapshot(), query = "dementia") +} +} +\seealso{ +Other main: +\code{\link{mx_reporter}()}, +\code{\link{print_full_results}()}, +\code{\link{run_search}()} +} +\concept{main} diff --git a/man/mx_snapshot.Rd b/man/mx_snapshot.Rd new file mode 100644 index 0000000..ba4ddfc --- /dev/null +++ b/man/mx_snapshot.Rd @@ -0,0 +1,35 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_snapshot.R +\name{mx_snapshot} +\alias{mx_snapshot} +\title{Access a static snapshot of the medRxiv repository} +\usage{ +mx_snapshot(commit = "master") +} +\arguments{ +\item{commit}{Commit hash for the snapshot, taken from +https://github.com/mcguinlu/medrxivr-data. Allows for reproducible +searching by specifying the exact snapshot used to perform the searches. +Defaults to "master", which will return the most recent snapshot.} +} +\value{ +Formatted dataframe +} +\description{ +[Available for medRxiv only] Rather than downloading a copy of + the medRxiv database from the API, which can become unavailable at peak + usage times, this allows users to import a maintained static snapshot of + the medRxiv repository. +} +\examples{ +\donttest{ +mx_data <- mx_snapshot() +} + +} +\seealso{ +Other data-source: +\code{\link{mx_api_content}()}, +\code{\link{mx_api_doi}()} +} +\concept{data-source} diff --git a/man/print_full_results.Rd b/man/print_full_results.Rd new file mode 100644 index 0000000..3f16f28 --- /dev/null +++ b/man/print_full_results.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_search.R +\name{print_full_results} +\alias{print_full_results} +\title{Search for terms in the dataset} +\usage{ +print_full_results(num_results, deduplicate) +} +\arguments{ +\item{num_results}{number of searched terms returned} + +\item{deduplicate}{Logical. Only return the most recent version of a record. +Default is TRUE.} +} +\description{ +Search for terms in the dataset +} +\seealso{ +Other main: +\code{\link{mx_reporter}()}, +\code{\link{mx_search}()}, +\code{\link{run_search}()} +} +\concept{main} diff --git a/man/run_search.Rd b/man/run_search.Rd new file mode 100644 index 0000000..625b967 --- /dev/null +++ b/man/run_search.Rd @@ -0,0 +1,32 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mx_search.R +\name{run_search} +\alias{run_search} +\title{Search for terms in the dataset} +\usage{ +run_search(mx_data, query, fields, deduplicate, NOT = "") +} +\arguments{ +\item{mx_data}{The mx_dataset filtered for the date limits} + +\item{query}{Character string, vector or list} + +\item{fields}{Fields of the database to search - default is Title, Abstract, +Authors, Category, and DOI.} + +\item{deduplicate}{Logical. Only return the most recent version of a record. +Default is TRUE.} + +\item{NOT}{Vector of regular expressions to exclude from the search. Default +is NULL.} +} +\description{ +Search for terms in the dataset +} +\seealso{ +Other main: +\code{\link{mx_reporter}()}, +\code{\link{mx_search}()}, +\code{\link{print_full_results}()} +} +\concept{main} diff --git a/man/skip_if_api_message.Rd b/man/skip_if_api_message.Rd new file mode 100644 index 0000000..81889b7 --- /dev/null +++ b/man/skip_if_api_message.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helpers.R +\name{skip_if_api_message} +\alias{skip_if_api_message} +\title{Skips API tests if API isn't working correctly} +\usage{ +skip_if_api_message() +} +\description{ +Skips API tests if API isn't working correctly +} +\keyword{internal} diff --git a/medrxivr.Rproj b/medrxivr.Rproj new file mode 100644 index 0000000..0ee12cd --- /dev/null +++ b/medrxivr.Rproj @@ -0,0 +1,22 @@ +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageCheckArgs: --as-cran +PackageRoxygenize: rd,collate,namespace diff --git a/pkgdown/favicon/apple-touch-icon-120x120.png b/pkgdown/favicon/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..1f577ad188e56d8f2fa234b4430a8ee304f12647 GIT binary patch literal 9051 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 TqNEbx5oDTbx~c^zi^u;1rJrhu literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/apple-touch-icon-152x152.png b/pkgdown/favicon/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e6a86b1013a93cc6ec6d68cbe47f8c1c88fc26 GIT binary patch literal 12332 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 literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/apple-touch-icon-76x76.png b/pkgdown/favicon/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf8bd8e965213f5649bafd7f13a78f453d7f56e GIT binary patch literal 5276 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 literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon-16x16.png b/pkgdown/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..93d8f304a72541a6bae13ce713cdf1201a533be1 GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`wK2cQF+FcdSM9$2F6TJ7sn8d^SKkf^;HrjTIauCt+lG_+NCue-Wv?8tvQth z|L|}B-{8_F@TYa=8NamV)+2{hJ6evUK9v#@ob0n<;)tzYKK)fzw`skb#xL>urRG0tU;NN9_;hZw zrQJ`n8?k0w4fEdKi}iobwX&l_!t;6AwX|IqwuH&ZxP6kG_~z~QB{}y$-I0;1V2xq8 zS0Er#w{d;$bO${_6R`;j&XQu44$2yD1g5jGFdS5DW$H5E@RxYQ(XPT!8CP-ixby$= zrlxbn$CL&A?-aX+XxwP%a+Q^o<0#PVU%O+1spGi?fgux=yxW3oL=rd-t=X8j*>`_Q z=%Qnr9UcZWH7h;x|Cdpn{_6SC)-QL?=zhMP=@DY3b#KzN&)sW3$_rl=zx~mMKXFA} z;kRdYQ+npyJL~)XI_JOR{btRk*LH5&xyA5K! zC8<`)MX5lF!N|bKMAy(j*T68u$k58z(8|D2+rYrez@U7tOB;%Y-29Zxv`X9>*be-$ z0%{1a3W+EQN-S3>D9TUE%t=)!sVqoU$Sf#HW?-n8^Y{}FM`4(T#wq{PXFQ(m_pwD+_y17GV}vaA`0(oWiWUIYi;~jVmXPoH-(Mg#C1b#{w@shF9W(C7+y3rvj~D N@O1TaS?83{1OU3l5WN5Z literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon-32x32.png b/pkgdown/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c83373f305df2ad6e58e12d43a57c3806023848b GIT binary patch literal 1656 zcmZ{jc~DbV6o(%PX&?kpP|&gkEr?6>nE+}~1~7>1i-3D3F$AOn21uxg6cA;UR#3L0 zC|Y2IQX3#C`yyaOB&-2NK^ECpqX@`ukAHTiy)*BfbMHIn-1GbHeK%d4Y?KM#6A%PZ zwmnLB155h$C}81D&x)-BBkyDBXo(;N@k%Q!+_#VHqi&7}a@i0;BCjFH5-dfIAqXEu zkO?M&&{7dZlY76+^&o;^f?XWktswx1!^z9b7ZnxVxN&3q_U#4+2CAy6%F4=EEEa>o zFqupj7Z(zVq^+$@rBc6s{c31vxMj!YHg%+1YVanGJTTrRh`xVW&eFd!g+OeX8-=r9RkDaplSta9|`RCPFau06y#p z!E`zuoVvO?2!nKh0NOh{I};KToSd8p1cJW4J_yOl$;r&j1TuPhdK3zU$K#ckmlqTi zfOeQdHK-F46VuexR8vy}q7ENE44^zbJnr4Q*VEI}+}sSCy1Topsi^@>A0HoqKmdw3 z91g%gaNs~lNC=d3kARX>oD!^XJdAv$HcZGk~JKy?t(O4meLwPnVUIm6n#awzf(n66os1ix0@{&*}1OiW=KCP~<2FVo_6(W&n zYHDiW(rW@Se6>Z;^45oak{_>ylfzdd<+>W-lX zzo$EJBf+C?Wku|!X!_^eYz|eSRD>tgR@N$(719dk1^bAnS6-e_+8p-2@6sl6+DBRH z&hKnW7Z-}?s$SBy)mD~@ZuHP#q_$Z};r<_D50*nKa_8)A=U@_5`9C?9tw}HVxVJGV~Xi}i#sDpR1>O9c0F2ABgK<=Mj!s<%6g{M%Pb79 zn`4}pnJAJZF^tjYubO(IRgIcj`p1V46>2J_jtow2t8S^5>7kXH&=wK1LqX+klzmO3 zOT-48$lL1det)&xt5t7OTdDT)cb?oG5(Wp2)?zCnjx&Ca(%xp* zypFtU$8NdooOIl>ouq;P9G%gKu;zHoW%d5ie&NT-iRT3)PEj#+k3U>*BL9Uc5f)$b zIvr+{oh2{agjD=}OR96xe;MwH0nhpb&x^(5(AYs7FbD;u7?by+WOT1PWiO4omxfYy zq9_eTkMJ2<|4Q(`=;iAj`u_?0j7G8{;rM0u6FfK8Pb6;8MQ>j}4v81a<&b>2JT`({ zx<5EWR0#AmGHP&^G};ckA=s@-yV*+WTh;9oH(=FC^ho1pUf8W7car2yN4>aFtS!b% dB9A_@+l@?UuIJ5InIyv&h^@5~U0}t$`VV4)@Gk%W literal 0 HcmV?d00001 diff --git a/pkgdown/favicon/favicon.ico b/pkgdown/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6f91922d9f4c7b4d4ba25b9f0aeac7d939af12e1 GIT binary patch literal 15086 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 + %\VignetteIndexEntry{building-complex-search-strategies} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +library(medrxivr) +library(dplyr) + +knitr::opts_chunk$set( + collapse = TRUE, + eval = TRUE, + warning = FALSE, + comment = "#>" +) +``` + + +## Building your search with Boolean operators + +First load the `medrxivr` package: + +```{r setup} +library(medrxivr) + +``` + +To find records that contain any of many terms, pass the terms as a vector to the `mx_search()` function, as in the code chunk below. Query terms can include regular expression syntax - see the [section at the end of this document](#regex) on common regular expression that may be useful when searching. + +``` {r} +myquery <- c("dementia","vascular","alzheimer's") # Combined with Boolean OR + +mx_results <- mx_search(data = mx_snapshot(), # Use daily snapshot for data + query = myquery) + +``` + +To find records relevant to more than one topic domain, create a vector for each topic (note: there is no upper limit on the number of topics your can have) and combine these vectors into a list which is then passed to the `mx_search()` function: + +``` {r} +topic1 <- c("dementia","vascular","alzheimer's") # Combined with Boolean OR +topic2 <- c("lipids","statins","cholesterol") # Combined with Boolean OR +myquery <- list(topic1, topic2) # Combined with Boolean AND + +mx_results <- mx_search(data = mx_snapshot(), + query = myquery) + +``` + +## Additional filters and options + +### Limit search by field + +By default, a range of fields (title, abstract, first author, subject, link (which contains DOI)) are searched, but you can limit the search to a subset of these using the `fields` argument: + +```{r} + +# Limit search to title/abstract +mx_results <- mx_search(data = mx_snapshot(), + query = "dementia", + fields = c("title","abstract")) + +# Search by DOI +mx_results <- mx_search(data = mx_snapshot(), + query = "10.1101/2020.01.30.20019836", + fields = "link") + +``` + +### Exclude records containing certain terms + +Often it is useful to be able to exclude records that contain a certain term that is not relevant to your search. For example, in the search below, we are looking for records related to "dementia" alone by excluding those that mention "mild cognitive impairment": + +```{r} +mx_results <- mx_search(data = mx_snapshot(), + query = "dementia", + NOT = "[Mm]ild cognitive impairment") +``` + +### Limit by date posted + +You can define either/both of the earliest and latest date you wish to include records from. Note: the search is inclusive of both dates specified: + +```{r} +mx_results <- mx_search(data = mx_snapshot(), + query = "dementia", + from_date = "2020-01-01", # 1st Jan 2020 + to_date = "2020-01-08") # 8th Jan 2020 +``` + +### Return multiple versions of a record + +_medRxiv_ allows authors to upload a new version of their preprint as often as they like. By default, `medrxivr` only returns the most recent version of the preprint, but if you are interested in exploring how a record changed over time, you can retrieve all versions of the preprint by setting `deduplicate = FALSE` + +```{r} +mx_results <- mx_search(data = mx_snapshot(), + query = "10.1101/2020.01.30.20019836", + fields = "link", + deduplicate = FALSE) +``` + +## Useful syntax for the systematic reviewer {#regex} + +### Capitalisation + +__Example regex:__ `[Dd]ementia` +__Description:__ The search is case sensitive, so this syntax allows you to find both Dementia and dementia using a single term, rather than having to enter them separately. However, setting the `autocaps` argument of `mx_search()` to `TRUE` will automatically search for both capitalised and uncapitalised versions of your search terms (e.g. with `auto_caps = TRUE` you just need to search for "dementia" to find both Dementia and dementia - behind the scenes, "dementia" is converted to "[Dd]ementia". + +### Wildcard + +__Example regex:__ `randomi*ation` +__Description:__ The wildcard operator "*" defines any single alphanumeric character - in this case, the term will find both randomisation and randomization. + + +### NEAR + +__Example regex:__ `systematic NEAR4 review` +__Description:__ The "NEAR4" operator defines that up to 4 words can be between systematic and review and the search will still find it. To change how far apart the terms are allowed to be, simply change the number following NEAR (e.g. to find terms that are only one word apart, the syntax would be `systematic NEAR1 review`). **Please note that the search is directional, in that the example term here will find "systematic methods for the review", but will not find "the review was systematic".** + +### Word limits + +__Example regex:__ `\\bNCOV\\b` +__Description:__ Sometimes it is useful to be able to define the start and end of terms. For example, if you were searching for NCOV-19, simply using `ncov` as your search term would also return records containing uncovered. Using `\\b` allows you to define where the term beings and ends, thus excluding false positive matches. + +### Example using these regexes + +To find records that contain "Mendelian" within 4 words of "randomisation" (with varying capitalisation of "Mendelian" and UK/US spellings of "randomisation"), the following syntax is correct: + +``` {r} +mx_results <- mx_search(data = mx_snapshot(), + query = "mendelian NEAR4 randomi*ation", + auto_caps = TRUE) + +``` + +### Regex tester + +To check whether your search term will find what you expect it to, there is a useful [regex tester](https://spannbaueradam.shinyapps.io/r_regex_tester/), designed by [Adam Spannbauer](https://adamspannbauer.github.io/2018/01/16/r-regex-tester-shiny-app/). diff --git a/vignettes/data_sources.png b/vignettes/data_sources.png new file mode 100644 index 0000000000000000000000000000000000000000..8d75ab8a62bbee1fefe992d955c05b32cd4de29d GIT binary patch literal 61400 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 U=8U>)@!u*pJOARuM_0f82l6qVSO5S3 literal 0 HcmV?d00001 diff --git a/vignettes/figs/data_sources.pptx b/vignettes/figs/data_sources.pptx new file mode 100644 index 0000000000000000000000000000000000000000..c0aa393e25ca322708ac0d00714fc94b3f33be2a GIT binary patch literal 48184 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
wNkR?ttz6`c40%L;c!xBr7EL)8| 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 z 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 + %\VignetteIndexEntry{medrxiv-api} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r,echo=FALSE, message=FALSE, warning=FALSE} +# Delete when done +library(medrxivr) +library(dplyr) + +knitr::opts_chunk$set( + collapse = TRUE, + eval = TRUE, + warning = FALSE, + comment = "#>" +) + +``` + +## Background + +The [Cold Spring Harbour Laboratory API](https://api.biorxiv.org/) provides a direct interface to the medRxiv and bioRxiv databases. **However, the API does not allow you to perform searches,** instead providing two endpoints that return either all content between two specified dates or all information held on a particular DOI. + +`medrxivr` provides two convenience functions for importing the data provided by these endpoints in R: `mx_api_content()` and `mx_api_doi()`. The results of either function can then be passed to `mx_search()` for searching. + +### By date range (`mx_api_content()`) + +The format of this endpoint is https://api.biorxiv.org/details/[server]/[interval]/[cursor] where 'interval' must be two YYYY-MM-DD dates separated by '/'. Where metadata for multiple papers is returned, results are paginated with 100 papers served in a call. The 'cursor' value can be used to iterate through the result. + +`mx_api_content()` automatically moves through the pages for you, capturing all records returned by the endpoint and returning them as an R object. For instance, https://api.biorxiv.org/details/medrxiv/2020-01-01/2020-01-31/0 will output 100 results (if that many remain) within the date range of 2020-01-01 to 2020-01-31 beginning from result 1. To import this into R as a dataframe: + +``` {r} +medrxiv_data <- mx_api_content(from_date = "2020-01-01", + to_date = "2020-01-05") + + +biorxiv_data <- mx_api_content(server = "biorxiv", + from_date = "2020-01-01", + to_date = "2020-01-05") + +``` + +### By DOI (`mx_api_doi()`) + +https://api.biorxiv.org/details/[server]/[DOI] returns detail for a single manuscript. For instance, https://api.biorxiv.org/details/medrxiv/10.1101/2020.02.25.20021568 will output metadata for the medRxiv paper with DOI 10.1101/2020.02.25.20021568. To import the results from this endpoint into R as a dataframe: + +``` {r} +mx_api_doi(doi = "10.1101/2020.02.25.20021568") + +``` + +## Accessing the raw API data + +Both functions contain a `clean` argument with is set to `TRUE` by default. This is to ensure that the datasets returned by the `mx_api_*()` functions can immediately be passed to `mx_search()`. However, there may be occasions where this is not required, and so setting this argument to `FALSE` will return the raw data provided by the API endpoints. For example: + +``` {r} +mx_api_content(to_date = "2019-07-01", clean = FALSE) +``` diff --git a/vignettes/medrxivr.Rmd b/vignettes/medrxivr.Rmd new file mode 100644 index 0000000..5d52fcd --- /dev/null +++ b/vignettes/medrxivr.Rmd @@ -0,0 +1,174 @@ +--- +title: "Get started" +author: "Luke A McGuinness" +date: "`r Sys.Date()`" +output: + rmarkdown::html_document: + toc: yes + toc_depth: 4 +vignette: > + %\VignetteIndexEntry{medrxivr} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r,echo=FALSE, message=FALSE,warning=FALSE} +# Delete when done +library(medrxivr) +library(dplyr) + +knitr::opts_chunk$set( + collapse = TRUE, + eval = FALSE, + comment = "#>" +) + +``` + +An increasingly important source of health-related bibliographic content are preprints - preliminary versions of research articles that have yet to undergo peer review. The two preprint repositories most relevant to health-related sciences are [medRxiv](https://www.medrxiv.org/) and [bioRxiv](https://www.biorxiv.org/), both of which are operated by the Cold Spring Harbor Laboratory. + +The goal of the `medrxivr` R package is two-fold. In the first instance, it provides programmatic access to the [Cold Spring Harbour Laboratory (CSHL) API](https://api.biorxiv.org/), allowing users to easily download medRxiv and bioRxiv preprint metadata (e.g. title, abstract, publication date, author list, etc) into R. The package also provides access to a maintained static snapshot of the medRxiv repository (see [Data sources](#medrxiv-data)). Secondly, `medrxivr` provides functions to search the downloaded preprint records using regular expressions and Boolean logic, as well as helper functions that allow users to export their search results to a .BIB file for easy import to a reference manager and to download the full-text PDFs of preprints matching their search criteria. + +## Installation + +You can install the development version of this package using: + +``` {r} +devtools::install_github("mcguinlu/medrxivr") +library(medrxivr) +``` + +## Data sources + +### medRxiv data + +`medrixvr` provides two ways to access medRxiv data: + + - `mx_api_content(server = "medrxiv")` creates a local copy of all data available from the medRxiv API at the time the function is run. + +``` {r} +# Get a copy of the database from the live medRxiv API endpoint +preprint_data <- mx_api_content() +``` + + - `mx_snapshot()` provides access to a static snapshot of the medRxiv database. The snapshot is created each morning at 6am using `mx_api_content()` and is stored as CSV file in the [medrxivr-data repository](https://github.com/mcguinlu/medrxivr-data). This method does not rely on the API (which can become unavailable during peak usage times) and is usually faster (as it reads data from a CSV rather than having to re-extract it from the API). Discrepancies between the most recent static snapshot and the live database can be assessed using `mx_crosscheck()`. + +``` {r} +# Get a copy of the database from the daily snapshot +preprint_data <- mx_snapshot() +``` + +The relationship between the two methods for the medRxiv database is summarised in the figure below: + +``` {r eval = TRUE, echo = FALSE, out.width = "500px", out.height = "400px"} + +knitr::include_graphics("data_sources.png") +``` + +### bioRxiv data + +Only one data source exists for the bioRxiv repository: + + - `mx_api_content(server = "biorxiv")` creates a local copy of all data available from the bioRxiv API endpoint at the time the function is run. __Note__: due to it's size, downloading a complete copy of the bioRxiv repository in this manner takes a long time (~ 1 hour). + +``` {r} +# Get a copy of the database from the live bioRxiv API endpoint +preprint_data <- mx_api_content(server = "biorxiv") +``` + +## Performing your search + +Once you have created a local copy of either the medRxiv or bioRxiv preprint database, you can pass this object (`preprint_data` in the examples above) to `mx_search()` to search the preprint records using an advanced search strategy. + +``` {r} + +# Perform a simple search +results <- mx_search(data = preprint_data, + query ="dementia") + +# Perform an advanced search +topic1 <- c("dementia","vascular","alzheimer's") # Combined with Boolean OR +topic2 <- c("lipids","statins","cholesterol") # Combined with Boolean OR +myquery <- list(topic1, topic2) # Combined with Boolean AND + +results <- mx_search(data = preprint_data, + query = myquery) + +``` + +## Dataset description + +The dataset (in this case, `results`) returned by the search function above contains 14 variables: + +```{r, eval = TRUE, echo = FALSE} + +mx_variables <- + data.frame( + Variable = c( + "ID" , + "title" , + "abstract", + "authors" , + "date" , + "category", + "doi" , + "version" , + "author_corresponding", + "author_corresponding_institution", + "link_page", + "link_pdf" , + "license" , + "published" + ), + Description = c( + "Unique identifier", + "Preprint title", + "Preprint abstract", + "Author list in the format 'LastName, InitalOfFirstName.' (e.g. McGuinness, L.). Authors are seperated by a semi-colon.", + "Date the preprint was posted, in the format YYYYMMDD.", + "On submission, medRxiv asks authors to classify their preprint into one of a set number of subject categories.", + "Preprint Digital Object Identifier.", + "Preprint version number. As authors can update their preprint at any time, this indicates which version of a given preprint the record refers to.", + "Corresponding authors name.", + "Corresponding author's institution.", + "Link to preprint webpage. The \"?versioned=TRUE\" is required, as otherwise, the URL will resolve to the most recent version of the article (assuming there is >1 version available).", + "Link to preprint PDF. This is used by `mx_download()` to download a copy of the PDF for that preprint.", + "Preprint license", + "If the preprint was subsequently published in a peer-reviewed journal, this variable contains the DOI of the published version." + ) + ) + + +knitr::kable(mx_variables, format = "html") %>% + kableExtra::kable_styling(full_width = F) %>% + kableExtra::column_spec(1, bold = T, border_right = T) %>% + kableExtra::column_spec(2, width = "30em") +``` + +## Export records identified by your search to a .BIB file + +`medrxivr` provides a helper function to export your search results to a .BIB file so that they can be easily imported into a reference manager (e.g. Zotero, Mendeley) + +```{r, eval = FALSE} + +mx_export(data = mx_results, + file = tempfile(fileext = ".bib")) + +``` + +## Download PDFs for records identified by your search + +Pass the results of your search above (`results`) to the `mx_download()` function to download a copy of the PDF for each record. + +```{r, eval = FALSE} + +mx_download(results, # Object returned by mx_search + tempdir(), # Temporary directory to save PDFs to + create = TRUE) # Create the directory if it doesn't exist + +``` + + +## Further guidance + +Please see the *[medrxivr website](https://docs.ropensci.org/medrxivr/index.html)* vignette for extended guidance on developing search strategies and for detailed instructions on interacting with the Cold Springs Harbour API for medRxiv and bioRxiv.