This key is extracted from the "Description" field of the DESCRIPTION file.
Example
library(cffr)# Create a `cff` object for YAML.cff_obj <-cff_create("rmarkdown")# Get the DESCRIPTION of **rmarkdown** to check.pkg <- desc::desc(file.path(find.package("rmarkdown"), "DESCRIPTION"))cat(cff_obj$abstract)#> Convert R Markdown documents into a variety of formats.cat(pkg$get("Description"))#> Convert R Markdown documents into a variety of formats.
This key is coerced from the "Authors" or "Authors@R" field of the DESCRIPTION file. By default, persons with the role "aut" or "cre" are considered, but this can be modified with the authors_roles argument.
Example
# An example DESCRIPTION.path <-system.file("examples/DESCRIPTION_many_persons", package ="cffr")pkg <- desc::desc(path)# See the listed persons.pkg$get_authors()#> [1] "Diego Hernangómez <fake@gmail.com> [aut, cre] (ORCID: <https://orcid.org/0000-0001-8457-4658>, email: error, not-valid: error)"#> [2] "Joe Doe <I am a wrong email> [aut] (affiliation: This One, country: ES, date-end: error)" #> [3] "Pepe Doe <fake@gmail.com> [aut] (error)" #> [4] "I am an entity [cre] (date-end: 2020-01-01, affiliation: error)" #> [5] "ERROR entity [cph] (for the administrative boundaries.)" #> [6] "ERROR person [cph] (ORCID: <https://orcid.org/0000-0003-2042-7063>, for the gisco_countrycode dataset.)"# Default behavior: use authors and creators (maintainers).cff_obj <-cff_create(path)cff_obj$authors#> - family-names: Hernangómez#> given-names: Diego#> email: fake@gmail.com#> orcid: https://orcid.org/0000-0001-8457-4658#> - family-names: Doe#> given-names: Joe#> affiliation: This One#> country: ES#> - family-names: Doe#> given-names: Pepe#> email: fake@gmail.com#> - name: I am an entity#> date-end: '2020-01-01'# Use copyright holders and maintainers.cff_obj_alt <-cff_create(path, authors_roles =c("cre", "cph"))cff_obj_alt$authors#> - family-names: Hernangómez#> given-names: Diego#> email: fake@gmail.com#> orcid: https://orcid.org/0000-0001-8457-4658#> - name: I am an entity#> date-end: '2020-01-01'#> - name: ERROR entity#> - family-names: person#> given-names: ERROR#> orcid: https://orcid.org/0000-0003-2042-7063
This key is extracted from the "RemoteSha" field of the DESCRIPTION file. This field is present in packages installed from r-universe or with package managers such as remotes and pak.
Example
# An example DESCRIPTION.path <-system.file("examples/DESCRIPTION_r_universe", package ="cffr")pkg <- desc::desc(path)# See `RemoteSha`.pkg$get("RemoteSha")#> RemoteSha #> "bdd9a29d7eabcc43c3195fe461f884932eba763c"cff_read(path)#> cff-version: 1.2.0#> message: 'To cite package "codemetar" in publications use:'#> type: software#> title: 'codemetar: Generate ''CodeMeta'' Metadata for R Packages'#> version: 0.3.5#> authors:#> - family-names: Boettiger#> given-names: Carl#> email: cboettig@gmail.com#> orcid: https://orcid.org/0000-0002-1642-628X#> - family-names: Salmon#> given-names: Maëlle#> orcid: https://orcid.org/0000-0002-2815-0399#> abstract: The 'Codemeta' Project defines a 'JSON-LD' format for describing software#> metadata, as detailed at <https://codemeta.github.io>. This package provides utilities#> to generate, parse, and modify 'codemeta.json' files automatically for R packages,#> as well as tools and examples for working with 'codemeta.json' 'JSON-LD' more generally.#> repository: https://ropensci.r-universe.dev#> repository-code: https://github.com/ropensci/codemetar#> url: https://docs.ropensci.org/codemetar/#> date-released: '2024-02-09'#> contact:#> - family-names: Boettiger#> given-names: Carl#> email: cboettig@gmail.com#> orcid: https://orcid.org/0000-0002-1642-628X#> keywords:#> - metadata#> - codemeta#> - ropensci#> - citation#> - credit#> - linked-data#> - json-ld#> - peer-reviewed#> - r#> - r-package#> - rstats#> license: GPL-3.0-only#> commit: bdd9a29d7eabcc43c3195fe461f884932eba763c#> doi: 10.32614/CRAN.package.codemetar
This key is coerced from the "Authors" or "Authors@R" field of the DESCRIPTION file. Only persons with the role "cre" (that is, maintainers) are considered.
This key contains the available package identifiers:
From DESCRIPTION metadata, it includes all the URLs not included in url or repository-code.
From the CITATION file, it includes all the DOIs not included in doi and the identifiers (if any) not included in the "identifiers" key of preferred-citation.
If the package is on CRAN and it has a CITATION file providing a DOI, the DOI provided by CRAN is added as well.
# A DESCRIPTION file without keywordsnokeywords <-system.file("examples/DESCRIPTION_basic", package ="cffr")tmp2 <-tempfile("DESCRIPTION")# Create a temporary file.file.copy(nokeywords, tmp2)#> [1] TRUEpkgnokeywords <- desc::desc(tmp2)cffnokeywords <-cff_create(tmp2)# No value is returned.cat(cffnokeywords$keywords)pkgnokeywords#> Type: Package#> Package: basicdesc#> Title: A Basic Description#> Version: 0.1.6#> Authors@R (parsed):#> * Marc Basic <marcbasic@gmail.com> [aut, cre, cph]#> Description: A very basic description. Should parse without problems.#> License: GPL-3#> URL: https://github.com/basic/package, https://basic.github.io/package#> BugReports: https://github.com/basic/package/issues#> Encoding: UTF-8#> LazyData: true#> RoxygenNote: 6.0.1.9000# Add keywords.desc::desc_set("X-schema.org-keywords","keyword1, keyword2, keyword3",file = tmp2)#> Type: Package#> Package: basicdesc#> Title: A Basic Description#> Version: 0.1.6#> Authors@R (parsed):#> * Marc Basic <marcbasic@gmail.com> [aut, cre, cph]#> Description: A very basic description. Should parse without problems.#> License: GPL-3#> URL: https://github.com/basic/package, https://basic.github.io/package#> BugReports: https://github.com/basic/package/issues#> Encoding: UTF-8#> LazyData: true#> RoxygenNote: 6.0.1.9000#> X-schema.org-keywords: keyword1, keyword2, keyword3cat(cff_create(tmp2)$keywords)#> keyword1 keyword2 keyword3
If the package source code is hosted on GitHub, cffr can also retrieve repository topics with the GitHub API and include those topics as keywords. This option is controlled with the gh_keywords argument:
description: The URL of the license text under which the software or dataset is licensed (only for non-standard licenses not included in the SPDX License List).
This key is extracted from inst/CITATION. If multiple references are provided, it selects the first citation as "preferred-citation" and uses the remaining citations as references.
Example
cffobj <-cff_create("rmarkdown")cffobj$`preferred-citation`#> type: manual#> title: 'rmarkdown: Dynamic Documents for R'#> authors:#> - family-names: Allaire#> given-names: JJ#> email: jj@posit.co#> - family-names: Xie#> given-names: Yihui#> email: xie@yihui.name#> orcid: https://orcid.org/0000-0003-0645-5666#> - family-names: Dervieux#> given-names: Christophe#> email: cderv@posit.co#> orcid: https://orcid.org/0000-0003-4474-2498#> - family-names: McPherson#> given-names: Jonathan#> email: jonathan@posit.co#> - family-names: Luraschi#> given-names: Javier#> - family-names: Ushey#> given-names: Kevin#> email: kevin@posit.co#> - family-names: Atkins#> given-names: Aron#> email: aron@posit.co#> - family-names: Wickham#> given-names: Hadley#> email: hadley@posit.co#> - family-names: Cheng#> given-names: Joe#> email: joe@posit.co#> - family-names: Chang#> given-names: Winston#> email: winston@posit.co#> - family-names: Iannone#> given-names: Richard#> email: rich@posit.co#> orcid: https://orcid.org/0000-0003-3925-190X#> year: '2026'#> notes: R package version 2.31#> url: https://github.com/rstudio/rmarkdowncitation("rmarkdown")[1]#> Allaire J, Xie Y, Dervieux C, McPherson J, Luraschi J, Ushey K, Atkins#> A, Wickham H, Cheng J, Chang W, Iannone R (2026). _rmarkdown: Dynamic#> Documents for R_. R package version 2.31,#> <https://github.com/rstudio/rmarkdown>.#> #> A BibTeX entry for LaTeX users is#> #> @Manual{,#> title = {rmarkdown: Dynamic Documents for R},#> author = {JJ Allaire and Yihui Xie and Christophe Dervieux and Jonathan McPherson and Javier Luraschi and Kevin Ushey and Aron Atkins and Hadley Wickham and Joe Cheng and Winston Chang and Richard Iannone},#> year = {2026},#> note = {R package version 2.31},#> url = {https://github.com/rstudio/rmarkdown},#> }
This key is extracted from inst/CITATION if multiple references are provided. The first citation becomes the preferred citation and the remaining citations become "references". cffr can also extract package dependencies and add them to this field by calling citation(auto = TRUE) for each dependency.
This key is extracted from the "Repository" field of the DESCRIPTION file. This field is usually populated when a package is hosted in a repository such as CRAN or r-universe. For packages without this field in the DESCRIPTION (which is the typical case for an in-development package), cffr tries to find the package in any of the default repositories specified in options("repos").
Bioconductor packages are identified when the "biocViews" field is present in the DESCRIPTION file.
# Use an installed package.inst <-cff_create("jsonlite")cat(inst$repository)#> https://CRAN.R-project.org/package=jsonlite# Demo file downloaded from the r-universe.runiv <-system.file("examples/DESCRIPTION_r_universe", package ="cffr")runiv_cff <-cff_create(runiv)cat(runiv_cff$repository)#> https://ropensci.r-universe.devdesc::desc(runiv)$get("Repository")#> Repository #> "https://ropensci.r-universe.dev"# For an in-development package.norepo <-system.file("examples/DESCRIPTION_basic", package ="cffr")# No repository is available.norepo_cff <-cff_create(norepo)cat(norepo_cff[["repository"]])# Change the name to a known package on CRAN: ggplot2.tmp <-tempfile("DESCRIPTION")file.copy(norepo, tmp)#> [1] TRUE# Change the package name.desc::desc_set("Package", "ggplot2", file = tmp)#> Type: Package#> Package: ggplot2#> Title: A Basic Description#> Version: 0.1.6#> Authors@R (parsed):#> * Marc Basic <marcbasic@gmail.com> [aut, cre, cph]#> Description: A very basic description. Should parse without problems.#> License: GPL-3#> URL: https://github.com/basic/package, https://basic.github.io/package#> BugReports: https://github.com/basic/package/issues#> Encoding: UTF-8#> LazyData: true#> RoxygenNote: 6.0.1.9000cat(cff_create(tmp)[["repository"]])#> https://CRAN.R-project.org/package=ggplot2
This key is extracted from the "BugReports" or "URL" fields in the DESCRIPTION file. cffr tries to identify the URL of the source on the following repositories:
This key is extracted from the "BugReports" or "URL" fields in the DESCRIPTION file. It corresponds to the first URL that is different from repository-code.
Example
# Many URLs.manyurls <-system.file("examples/DESCRIPTION_many_urls", package ="cffr")cat(cff_create(manyurls)$url)#> https://test.github.io/package/# Check the source metadata.desc::desc(manyurls)#> Type: Package#> Package: manyurls#> Title: A lot of urls#> Version: 0.1.6#> Authors@R (parsed):#> * Marc Basic <marcbasic@gmail.com> [aut, cre, cph]#> Description: This package has many urls. Specifically, 1 Bug Reports and 6#> URLs. Expected is to have 1 repository-code, 1 url and 3 URLs, since#> there is 1 duplicate and 1 invalid url.#> License: GPL-3#> URL: https://github.com/test/package, https://test.github.io/package/,#> https://r-forge.r-project.org/projects/test/, http://google.ru,#> https://gitlab.com/r-packages/behaviorchange, this.is.not.an.url#> BugReports: https://github.com/test/package/issues#> Encoding: UTF-8