Точка в имени функции может означать любое из следующего:
- вообще ничего
- разделитель между методом и классом в методах S3
- , чтобы скрытьимя функции
Возможные значения
1.Ничего вообще
Точка в data.frame
не отделяет data
от frame
, кроме как визуально.
2.Разделение методов и классов в методах S3
plot
является одним примером универсального метода S3.Таким образом, plot.lm
и plot.glm
являются основными определениями функций, которые используются при вызове plot(lm(...))
или plot(glm(...))
3.Чтобы скрыть внутренние функции
При написании пакетов иногда полезно использовать начальные точки в именах функций, поскольку эти функции несколько скрыты от общего вида.Функции, которые должны быть чисто внутренними для пакета, иногда используют это.
В этом контексте «несколько скрытый» просто означает, что переменная (или функция) обычно не отображается, когда вы перечисляете объект с помощью ls()
.Чтобы заставить ls
показывать эти переменные, используйте ls(all.names=TRUE)
.Используя точку в качестве первой буквы переменной, вы изменяете область действия самой переменной.Например:
x <- 3
.x <- 4
ls()
[1] "x"
ls(all.names=TRUE)
[1] ".x" "x"
x
[1] 3
.x
[1] 4
4.Другие возможные причины
В пакете plyr Хэдли он использует соглашение для использования начальных точек в именах функций.Это как механизм, позволяющий убедиться, что при разрешении имен переменных значения разрешаются в пользовательских переменных, а не во внутренних переменных функций.
Осложнения
Эта путаница различных применений может привестив очень запутанные ситуации, потому что все эти разные варианты использования могут быть смешаны в одном и том же имени функции.
Например, чтобы преобразовать data.frame
в список, который вы используете as.list(..)
as.list(iris)
В этом случае as.list
- это общий метод S3, и вы передаете ему data.frame
.Таким образом, функция S3 называется as.list.data.frame
:
> as.list.data.frame
function (x, ...)
{
x <- unclass(x)
attr(x, "row.names") <- NULL
x
}
<environment: namespace:base>
И для чего-то действительно впечатляющего загрузите пакет data.table
и посмотрите на функцию 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
}
<environment: namespace:data.table>