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 is coerced from the "doi" field of the preferred-citation object. If it is not present, cffr adds the canonical CRAN DOI only when the package metadata identifies CRAN as its repository or a repository lookup resolves to the canonical CRAN package URL. Finding the package in another configured repository does not produce a CRAN DOI. For example, the canonical DOI for cffr is https://doi.org/10.32614/CRAN.package.cffr.
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.
cffr removes identical entries after merging identifiers from these sources.
The comma-separated values are trimmed and empty or duplicate values are removed. A single keyword is preserved as a one-item CFF keywords array.
Example
# A DESCRIPTION file without keywords.nokeywords <-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. When cff_create() reads this file, all fields from DESCRIPTION, including custom fields, are available through the meta object used by the CITATION file. If multiple references are provided, cffr selects the first citation as "preferred-citation" and uses the remaining citations as references. If the file cannot be read with the package metadata, cffr does not retry with metadata from another package.
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.32#> 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.32,#> <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.32},#> 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".
When dependencies = TRUE, cffr also adds installed package dependencies by calling citation(auto = TRUE) for each one. It preserves the citation metadata, including the title, abstract, authors and year, while adapting the reference to the CFF software type. It adds the dependency scope and version constraint from the source DESCRIPTION, URLs and repository information from the installed dependency’s DESCRIPTION and the canonical CRAN DOI only when the dependency is available from CRAN. A release date, when available, determines the year, with the year returned by citation() retained otherwise. The year is omitted only when neither source provides one.
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 file (typically packages under development), cffr tries to find the package in any of the 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# Example file downloaded from 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