library(citeme)
# Store individuals from a project with a DESCRIPTION file
store_individuals("path/to/r-package")
# Store individuals from a project with citation metadata
store_individuals("path/to/project")Introduction
The citeme package provides a collection of helper functions for managing individual contributor information across your projects. These functions help you store, retrieve, and reuse information about people who contribute to your work, ensuring consistency and reducing repetitive data entry.
Why Use Individual Helper Functions?
When working on multiple projects, you often need to cite the same contributors repeatedly. The individual helper functions in citeme allow you to:
- Build a local database of contributor information
- Reuse stored information across projects
- Maintain consistent contributor details
- Convert individual information between different formats
- Add contributors to various file types (
DESCRIPTION,README,Quarto,Bookdown)
Storing Individual Information
The store_individuals() function extracts contributor information from a project and saves it to a local database for future use. This database is stored in your user data directory and persists across projects.
The function extracts information from:
-
R packages: Reads the
DESCRIPTIONfile to get author details - Other projects: Reads citation metadata files
Each time you store individuals, the function tracks how often each person appears across your projects. This usage count helps prioritise frequently used contributors when selecting individuals later.
Selecting and Reusing Individuals
The select_individual() function allows you to interactively choose a contributor from your stored database or add a new one.
# Interactive selection from stored individuals
individual <- select_individual()
# Quick selection by email address
individual <- select_individual(email = "john.doe@example.com")
# Selection with specific language for affiliation
# provided the individual's email matches an organisation with multilingual
# names
individual <- select_individual(lang = "nl-BE")The function presents stored individuals ordered by:
- Usage count (most frequently used first)
- Family name
- Given name
- ORCID identifier
When selecting interactively, you can also:
- Add a new individual if they are not in the database
- Update existing individual information
Converting Individual Information
To Person Objects
The individual2person() function converts individual information into R’s person object format, which is used in DESCRIPTION files and citation metadata.
# Convert with default author role
person_obj <- individual2person(individual)
# Convert with specific role
person_obj <- individual2person(individual, role = "cre")
# Convert with multiple roles
person_obj <- individual2person(individual, role = c("aut", "cre"))
# Interactive selection and conversion
person_obj <- individual2person(lang = "en-GB")The function automatically handles:
- Optional fields (email, ORCID, affiliation)
- Multiple roles per person
- Language-specific affiliations
To Badge Format
The individual2badge() function creates Markdown badges for displaying contributor information with ORCID identifiers and affiliations.
# Create a badge for an individual
badge_markdown <- individual2badge(individual)
# Result example:
# [](https://orcid.org/
# 0000-0000-0000-0000)This is useful for README files and documentation where you want to display contributor information with clickable links.
To Data Frames
The individual2df() function converts person objects into data frames, making it easier to work with contributor information in tabular format.
# Convert a person object to a data frame
person_df <- individual2df(person_obj)
# The resulting data frame has columns:
# - given: given name
# - family: family name
# - email: email address
# - orcid: ORCID identifier
# - ror: ROR identifier for affiliation
# - affiliation: affiliation name
# - role: role(s) as comma-separated stringThe function handles:
- Single person objects
- Lists of person objects
- Missing fields (replaced with empty strings)
- Multiple roles (combined into comma-separated string)
Adding Individuals to Files
The add_individual() function provides a unified interface for adding contributors to various file types in your project.
# Add an author to a DESCRIPTION file
add_individual("path/to/DESCRIPTION", role = "aut")
# Add a maintainer to an R package
add_individual("path/to/package", role = "cre")
# Add multiple roles
add_individual("path/to/package", role = c("aut", "cre"))
# Add to a Quarto document
add_individual("path/to/document.qmd", role = "aut")
# Add a reviewer to a Quarto document
add_individual("path/to/document.qmd", role = "rev")Supported file types:
- DESCRIPTION files: R package metadata
-
Quarto files:
_quarto.ymlor*.qmddocuments -
README files:
README.mdorREADME.Rmd -
Bookdown index files:
index.mdorindex.Rmd
The function automatically:
- Detects the file type
- Prompts for individual selection
- Adds the individual with the specified role(s)
- Updates the file in place
Role Mapping for Different File Types
For R packages (DESCRIPTION files), all standard R CMD check roles are supported:
-
"aut": Author -
"cre": Creator/Maintainer -
"ctb": Contributor -
"rev": Reviewer -
"cph": Copyright holder -
"fnd": Funder -
"pbl": Publisher
For Quarto and Bookdown documents, roles are mapped to YAML fields:
-
"aut"->authorfield -
"rev"->reviewerfield -
"cph"->rightsholderfield -
"fnd"->funderfield -
"pbl"->publisherfield
Helper Functions for Roles
Checking Person Roles
The has_person_role() function checks whether a person object has specific roles.
# Check if person has author role
has_person_role(person_obj, role = "aut")
# Check for multiple roles
has_person_role(person_obj, role = c("aut", "cre"))
# Returns TRUE if the person has at least one of the specified rolesSelecting Roles Interactively
The select_person_role() function helps you interactively specify roles for a contributor.
# Interactive role selection
roles <- select_person_role()
# The function presents common roles and allows you to select one or more:
# - Author
# - Creator (Maintainer)
# - Contributor
# - Reviewer
# - Copyright holder
# - Funder
# - PublisherTypical Workflow
Here is a typical workflow for managing individuals across projects:
library(citeme)
# Step 1: Store individuals from existing projects
store_individuals("projects/my-r-package")
store_individuals("projects/another-project")
# Step 2: Start a new project and add contributors
# The function will prompt you to select from stored individuals
add_individual("new-project/DESCRIPTION", role = c("aut", "cre"))
# Step 3: Add more contributors as needed
add_individual("new-project/DESCRIPTION", role = "ctb")
# Step 4: Store the new project's individuals for future use
store_individuals("new-project")Working with Multiple Languages
The individual helper functions support multilingual affiliations through the lang parameter. This is only relevant when the individual is a member of a known organisation (see vignette("organisation")) that has names in multiple languages. When an organisation has names in multiple languages, you can specify which language to use:
# Select individual with English affiliation
individual_en <- select_individual(lang = "en-GB")
# Select individual with Dutch affiliation
individual_nl <- select_individual(lang = "nl-BE")
# The affiliation field will use the specified language when available
person_en <- individual2person(lang = "en-GB")The language code should follow the BCP 47 standard (e.g. "en-GB", "nl-BE", "fr-FR").
Best Practices
Build your database early: Run
store_individuals()on your existing projects to build a comprehensive database of contributors. Please note thatstore_individuals()only extracts information from projects that contains metadata in the same format as the one thatcitemewrites.Use email for quick lookups: When you know the contributor’s email, use
select_individual(email = "...")to avoid interactive selection.Keep information updated: If contributor details change (e.g. new affiliation), update them when prompted during
select_individual().Store after each project: Run
store_individuals()after adding contributors to a new project to keep your database current.Be consistent with roles: Use standard
R CMD checkroles for packages and appropriate roles for other document types.
Related Functions
For information about validating contributor information, see the vignette("interactive_input") vignette. For organisation-level settings, see the vignette("organisation") vignette.