| name | r-style-guide |
| description | R style guide covering naming conventions, spacing, layout, and function design best practices. Use when mentions "estilo de código", "code style", "formatação", "formatting", "format code", "formatar código", "convenções", "conventions", "naming convention", "convenção de nomes", "snake_case", "camelCase", "styler", "lintr", "apply styler", "run styler", "aplicar styler", "executar styler", "tidyverse style", "estilo tidyverse", "R coding standards", "padrões de código R", "padrões de código", "best practices", "boas práticas", "code quality", "qualidade de código", "check style", "verificar estilo", "R style guide", "guia de estilo R", "function design", "design de funções", "clean code R", "código limpo", "indentation", "indentação", "spacing", "espaçamento", "assignment operator", "operador de atribuição", "arrow operator", "naming variables", "nomear variáveis", "naming functions", "nomear funções", "code organization", "organização de código", "file structure", "estrutura de arquivos", "comments", "comentários", "documentation style", "estilo de documentação", or asks about R coding standards, style conventions, formatting rules, or best practices for writing clean R code. |
| version | 1.1.0 |
| user-invocable | false |
| allowed-tools | Read, Grep, Glob |
R Style Guide & Function Writing Best Practices
Consistent naming, spacing, structure, and function design for R code
Function Writing Best Practices
Structure and Style
rescale01 <- function(x) {
rng <- range(x, na.rm = TRUE, finite = TRUE)
(x - rng[1]) / (rng[2] - rng[1])
}
map_dbl()
map_chr()
map_lgl()
Naming and Arguments
calculate_mean_score <- function(data, score_col) {
}
my_function <- function(.data, ...) {
}
Style Guide Essentials
Object Names
- Use snake_case for all names
- Variable names = nouns, function names = verbs
- Avoid dots except for S3 methods
day_one
calculate_mean
user_data
DayOne
calculate.mean
userData
Spacing and Layout
x[, 1]
mean(x, na.rm = TRUE)
if (condition) {
action()
}
data |>
filter(year >= 2020) |>
group_by(category) |>
summarise(
mean_value = mean(value),
count = n()
)
Assignment
x <- 5
x = 5
Indentation and Line Length
- Use 2 spaces for indentation (never tabs)
- Keep lines under 80 characters when possible
- For long function calls, put each argument on its own line
do_something_complicated(
data = my_data,
arg_one = value_one,
arg_two = value_two,
arg_three = value_three
)
result <- data |>
filter(year >= 2020) |>
mutate(
new_var = old_var * 2,
another_var = str_to_lower(text_var)
) |>
summarise(
mean_value = mean(value),
.by = category
)
Comments
running_avg <- zoo::rollmean(values, k = 5)
x <- x + 1
File Organization
library(dplyr)
library(ggplot2)
source("R/helpers.R")
MAX_ITERATIONS <- 1000
DEFAULT_THRESHOLD <- 0.05
process_data <- function(data) {
}
main <- function() {
data <- read_csv("data/input.csv")
result <- process_data(data)
write_csv(result, "data/output.csv")
}
Function Design Guidelines
Single Responsibility
read_and_validate <- function(path) {
data <- read_csv(path)
validate_columns(data)
data
}
validate_columns <- function(data) {
required <- c("id", "value", "date")
missing <- setdiff(required, names(data))
if (length(missing) > 0) {
stop("Missing columns: ", paste(missing, collapse = ", "))
}
}
do_everything <- function(path, output_path, ...) {
}
Return Values
calculate_metrics <- function(data) {
metrics <- list(
mean = mean(data$value),
sd = sd(data$value),
n = nrow(data)
)
return(metrics)
}
square <- function(x) {
x^2
}
process <- function(x) {
if (is.null(x)) return(NULL)
result
}
Error Handling
validate_input <- function(x, name = "x") {
if (!is.numeric(x)) {
stop("`", name, "` must be numeric, not ", typeof(x), call. = FALSE)
}
if (length(x) == 0) {
stop("`", name, "` cannot be empty", call. = FALSE)
}
}
validate_input_cli <- function(x) {
if (!is.numeric(x)) {
cli::cli_abort(
"{.arg x} must be numeric, not {.cls {class(x)}}."
)
}
}
Default Arguments
summarise_data <- function(data, na.rm = TRUE, digits = 2) {
}
filter_data <- function(data, min_value = NULL, max_value = NULL) {
if (!is.null(min_value)) {
data <- filter(data, value >= min_value)
}
if (!is.null(max_value)) {
data <- filter(data, value <= max_value)
}
data
}
Tidyverse API Conventions
Data-First Argument
my_transform <- function(data, var, threshold = 0.5) {
data |>
filter({{ var }} > threshold)
}
data |> my_transform(value, threshold = 0.8)
Prefixed Non-Standard Arguments
group_summary <- function(.data, ..., .by = NULL) {
.data |>
summarise(..., .by = {{ .by }})
}
Consistent Return Types
my_function <- function(data) {
result <- data |>
filter(!is.na(value))
tibble::as_tibble(result)
}
Common Style Mistakes
Avoid These Patterns
x<-1+2
x <- 1 + 2
if ((x > 0)) {}
if (x > 0) {}
if (x == T) {}
if (x == TRUE) {}
x <- 1; y <- 2
x <- 1
y <- 2
attach(mtcars)
mean(mpg)
detach(mtcars)
mean(mtcars$mpg)
with(mtcars, mean(mpg))
mtcars |> pull(mpg) |> mean()