Точка в имени функции может означать любое из следующего:
- вообще ничего
- разделитель между методом и классом в методах 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>
person
Andrie
schedule
23.09.2011
is.na
,as.data.frame
, ...) не является обычным в других языках программирования, но мне это нравится. - person Tomas   schedule 23.09.2011purrr
(purrr.tidyverse.org) теперь добавляет еще один уровень смысла, как в~ .x+1
==function(x) x+1
. - person isomorphismes   schedule 07.09.2017_
в легкодоступное место (например, вместо клавишиShopping
…) - person isomorphismes   schedule 07.09.2017