Estilo de escritura en R

Author
Affiliation

Mtro. Santiago Ríos

Guía de Estilo de R

R es un lenguaje de programación de alto nivel utilizado principalmente para el cálculo estadístico y la creación de gráficos. El objetivo de la Guía de Estilo de Programación en R es facilitar la lectura, el intercambio y la verificación de nuestro código en R.

La Guía de Estilo de R se basa en la Guía de Estilo Tidyverse de Hadley Wickham.

Sintaxis

Notación y nomenclatura

Nombres de archivos

Los nombres de los archivos deben ser significativos y terminar en .R.

# Correcto
fit-models.R
utility-functions.R

# Incorrecto
foo.r
stuff.r

Si los archivos deben ejecutarse en secuencia, antepón números:

0-download.R
1-parse.R
2-explore.R

Nombres de objetos

“Sólo hay dos cosas difíciles en la Ciencia de la Computación: la invalidación de caché y nombrar cosas.”
— Phil Karlton

Los nombres de variables y funciones deben estar en minúsculas. Usa un guion bajo (_) para separar palabras dentro de un nombre. Generalmente, los nombres de variables deben ser sustantivos y los nombres de funciones deben ser verbos. Esfuérzate por usar nombres que sean concisos y significativos (¡esto no es fácil!).

# Correcto
day_one
day_1

# Incorrecto
first_day_of_the_month
DayOne
dayone
djm1

En la medida de lo posible, evita usar nombres de funciones y variables existentes. Hacerlo causará confusión para los lectores de tu código.

# Incorrecto
T <- FALSE
c <- 10
mean <- function(x) sum(x)

Espaciado

Coloca espacios alrededor de todos los operadores infijos (=, +, -, <-, etc.). La misma regla se aplica al usar = en llamadas a funciones. Siempre pon un espacio después de una coma, y nunca antes (igual que en el inglés regular).

# Correcto
average <- mean(feet / 12 + inches, na.rm = TRUE)

# Incorrecto
average<-mean(feet/12+inches,na.rm=TRUE)

Hay una pequeña excepción a esta regla: :, :: y ::: no necesitan espacios alrededor.

# Correcto
x <- 1:10
base::get

# Incorrecto
x <- 1 : 10
base :: get

Coloca un espacio antes de los paréntesis izquierdos, excepto en una llamada a función.

# Correcto
if (debug) do(x)
plot(x, y)

# Incorrecto
if(debug)do(x)
plot (x, y)

El espaciado extra (es decir, más de un espacio en fila) es aceptable si mejora la alineación de signos iguales o asignaciones (<-).

list(
  total = a + b + c,
  mean  = (a + b + c) / n
)

No coloques espacios alrededor del código en paréntesis o corchetes (a menos que haya una coma, en cuyo caso, sigue la regla anterior).

# Correcto
if (debug) do(x)
diamonds[5, ]

# Incorrecto
if ( debug ) do(x)  # No debe haber espacios alrededor de debug
x[1,]   # Necesita un espacio después de la coma
x[1 ,]  # El espacio va después de la coma, no antes

Llaves

Una llave de apertura nunca debe ir en su propia línea y siempre debe ser seguida por una nueva línea. Una llave de cierre siempre debe ir en su propia línea, a menos que esté seguida de else.

Siempre indenta el código dentro de las llaves.

# Correcto

if (y < 0 && debug) {
  message("Y is negative")
}

if (y == 0) {
  log(x)
} else {
  y ^ x
}

# Incorrecto

if (y < 0 && debug)
message("Y is negative")

if (y == 0) {
  log(x)
} 
else {
  y ^ x
}

Está bien dejar declaraciones muy cortas en la misma línea:

if (y < 0 && debug) message("Y is negative")

Asignación

Usa <-, no =, para la asignación.

# Correcto
x <- 5

# Incorrecto
x = 5

comentarios

Comenta tu código. Cada línea de un comentario debe comenzar con el símbolo de comentario y un espacio: #. Los comentarios deben explicar el porqué, no el qué.

Usa líneas comentadas de - y = para dividir tu archivo en secciones fácilmente legibles.

# Load data ---------------------------

# Plot data ---------------------------

Convenciones de Nomenclatura

Identificar las funciones con BigCamelCase para distinguirlas claramente de otros objetos.

BigCamelCase vs. dot.case: BigCamelCase es una convención de nomenclatura en la que las palabras se concatenan sin espacios y cada palabra comienza con una letra mayúscula. Por ejemplo, CalculateSum. En cambio, dot.case utiliza puntos para separar palabras, como en calculate.sum.

# Correcto
DoNothing <- function() {
  return(invisible(NULL))
}

Los nombres de las funciones privadas deben comenzar con un punto. Esto ayuda a comunicar tanto el origen de la función como su uso previsto.

# Correcto
.DoNothingPrivately <- function() {
  return(invisible(NULL))
}

Pipes

Asignación a la derecha

No se recomienda la asignación a la derecha.

# Incorrecto
iris %>%
  dplyr::summarize(max_petal = max(Petal.Width)) -> results

# Correcto
results <- iris %>%
  dplyr::summarize(max_petal = max(Petal.Width))

Esta convención difiere sustancialmente de las prácticas en otros lenguajes y dificulta ver dónde se define un objeto en el código. Por ejemplo, buscar foo <- es más fácil que buscar foo <- y -> foo (posiblemente dividido en varias líneas).

Usar retornos explícitos

No confíes en la característica de retorno implícito de R. Es mejor ser claro sobre tu intención de return() un objeto.

# Correcto
AddValues <- function(x, y) {
  return(x + y)
}

# Incorrecto
AddValues <- function(x, y) {
  x + y
}