studio - tablas en r
Nomenclatura de funciones para paquetes R (1)
Los conflictos de nombre ocurren cuando se cargan dos paquetes que contienen funciones con el mismo nombre. Por lo tanto, los conflictos de nombres se pueden evitar en dos lugares:
- al definir nombres de funciones en un paquete
- al llamar funciones desde un paquete
Crear funciones con nombres únicos
En el momento de escribir este artículo (23 de agosto de 2017), la increíble cantidad de 11272 paquetes estaba disponible en CRAN (la última cifra se puede encontrar aquí ) y se agregan nuevos paquetes cada día .
Por lo tanto, la creación de nombres de funciones que son únicos hoy puede causar conflictos de nombres en el futuro cuando se agregarán otros paquetes.
Alistaire ya mencionó la opción de ponerle un prefijo a todas tus funciones. Además de stringi
y stringr
, los paquetes de forcats
son otro ejemplo que usa los prefijos fct_
y lvls_
.
Este enfoque puede reducir en gran medida la probabilidad de conflictos de nombres.
(Aunque no se garantiza que ningún otro mantenedor de paquetes pueda elegir el mismo prefijo).
Llamar funciones de forma inequívoca con el operador doble de dos puntos
En mi humilde opinión, la responsabilidad final para evitar los conflictos de nombres es del usuario.
He visto preguntas aquí en SO con más de media docena de paquetes cargados. O bien, se llama library(tidyverse)
por conveniencia, que está cargando otros 19 paquetes donde dplyr
y tidyr
habrían sido suficientes.
Al saturar el espacio de nombres con muchos paquetes cargados aumenta el riesgo de conflictos de nombres. E incluso con solo dos paquetes cargados, pueden producirse conflictos de nombres. Por ejemplo, el lubridate
y el paquete data.table
ambos han definido
hour, isoweek, mday, minute, month, quarter, second, wday, week, yday, year
La función a la que se llama dependerá del orden en que se hayan cargado los paquetes. (Puede usar los conflicts()
para encontrar objetos que existen con el mismo nombre en dos o más lugares en la ruta de búsqueda).
Para evitar ambigüedades y resultados inesperados, sugiero que cargue la menor cantidad posible de paquetes y que use el operador doble de dos puntos ?"::"
para llamar a funciones desde paquetes sin cargar el paquete de antemano, por ejemplo,
library(data.table)
DT <- data.table(t = lubridate::now() + 0:3)
# call function from loaded package data.table
DT[, second(t)]
[1] 18 19 20 21
# call function from lubridate package
DT[, lubridate::second(t)]
[1] 18.88337 19.88337 20.88337 21.88337
Hay otro beneficio de usar el operador doble de colon. Servirá como una documentación dentro del código desde el que se está llamando a una función.
Esto ocurre a expensas de unas pocas pulsaciones de tecla adicionales, pero puede ahorrar mucho tiempo cuando un código es inspeccionado, modificado o depurado semanas o años después. He visto muchas preguntas sobre SO, donde OP no ha mencionado el paquete.
Estoy escribiendo un paquete R y realmente me gustaría evitar el uso de nombres de funciones que se encuentran en otros paquetes. Por ejemplo, planeé llamar a una función ''anotar'', pero esto ya se ha utilizado en el paquete NLP. Evidentemente, es mejor evitar opciones obvias de nombres, pero ¿existe una forma sistemática de buscar en una lista exhaustiva de nombres de funciones publicados por CRAN para evitar la duplicación? Aprecio que esto es principalmente importante para los paquetes compartidos de CRAN, pero también puede ser relevante cuando se comparte localmente en caso de que exista un conflicto con otro paquete cargado.