Te recomendamos que revises esta respuesta en un entorno controlado antes de pasarlo a producción, un saludo.
Solución:
Un punto en el nombre de la función puede significar cualquiera de los siguientes:
- nada en absoluto
- un separador entre método y clase en métodos S3
- para ocultar el nombre de la función
Posibles significados
1. Nada en absoluto
El punto en data.frame
no se separa data
desde frame
, que no sea visualmente.
2. Separación de métodos y clases en métodos S3
plot
es un ejemplo de un método S3 genérico. Por lo tanto plot.lm
y plot.glm
son las definiciones de funciones subyacentes que se utilizan al llamar plot(lm(...))
o plot(glm(...))
3. Ocultar funciones internas
Al escribir paquetes, a veces es útil usar puntos iniciales en los nombres de las funciones porque estas funciones están algo ocultas a la vista general. Las funciones que están destinadas a ser puramente internas de un paquete a veces usan esto.
En este contexto, “algo oculto” simplemente significa que la variable (o función) normalmente no aparecerá cuando enumere el objeto con ls()
. Para forzar ls
para mostrar estas variables, use ls(all.names=TRUE)
. Al usar un punto como primera letra de una variable, cambia el alcance de la propia variable. Por ejemplo:
x <- 3
.x <- 4
ls()
[1] "x"
ls(all.names=TRUE)
[1] ".x" "x"
x
[1] 3
.x
[1] 4
4. Otras posibles razones
En el paquete plyr de Hadley, usa la convención para usar puntos iniciales en los nombres de las funciones. Esto es un mecanismo para intentar garantizar que al resolver nombres de variables, los valores se resuelvan en las variables de usuario en lugar de en las variables de función interna.
Complicaciones
Esta mezcolanza de diferentes usos puede llevar a situaciones muy confusas, porque estos diferentes usos pueden mixed en el mismo nombre de función.
Por ejemplo, para convertir un data.frame
a una lista que usas as.list(..)
as.list(iris)
En este caso as.list
es un método genérico de S3 y está pasando un data.frame
lo. Por lo tanto, la función S3 se llama as.list.data.frame
:
> as.list.data.frame
function (x, ...)
x <- unclass(x)
attr(x, "row.names") <- NULL
x
Y para algo realmente espectacular, cargue el data.table
paquete y mira la función as.data.table.data.frame
:
> library(data.table)
> methods(as.data.table)
[1] as.data.table.data.frame* as.data.table.data.table* as.data.table.matrix*
Non-visible functions are asterisked
> data.table:::as.data.table.data.frame
function (x, keep.rownames = FALSE)
if (keep.rownames)
return(data.table(rn = rownames(x), x, keep.rownames = FALSE))
attr(x, "row.names") = .set_row_names(nrow(x))
class(x) = c("data.table", "data.frame")
x
Al comienzo de un nombre, funciona como la convención de nombre de archivo de UNIX para mantener los objetos ocultos de forma predeterminada.
ls()
character(0)
.a <- 1
ls()
character(0)
ls(all.names = TRUE)
[1] ".a"
Puede ser solo un token sin un significado especial, no hace nada más que cualquier otro token permitido.
my.var <- 1
my_var <- 1
myVar <- 1
Se utiliza para el envío del método S3. Entonces, si defino la clase simple "myClass" y creo objetos con esa clase attribute, entonces las funciones genéricas como print () se enviarán automáticamente a mi método de impresión específico.
myvar <- 1
print(myvar)
class(myvar) <- c("myClass", class(myvar))
print.myClass <- function(x, ...)
print(paste("a special message for myClass objects, this one has length", length(x)))
return(invisible(NULL))
print(myvar)
Existe una ambigüedad en la sintaxis de S3, ya que no se puede saber a partir del nombre de una función si es un método de S3 o simplemente un punto en el nombre. Pero es un mecanismo muy simple que es muy poderoso.
Hay mucho más en cada uno de estos tres aspectos, y no debería tomar mis ejemplos como una buena práctica, pero son las diferencias básicas.
Si haces scroll puedes encontrar las crónicas de otros sys admins, tú incluso puedes dejar el tuyo si lo crees conveniente.