Крапка в назві функції може означати будь-що з наступного:
- нічого взагалі
- роздільник між методом і класом у методах 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. Інші можливі причини
У Хедлі плирпакунок, він використовує конвенцію для використання перших крапок в іменах функцій. Це як механізм, який намагається забезпечити, щоб при вирішенні імен змінних значення переходили до змінних користувача, а не до змінних внутрішніх функцій.
Ускладнення
Ця міша різного використання може призвести до дуже заплутаних ситуацій, оскільки ці різні способи використання можуть змішуватися в одній і тій самій назві функції.
Наприклад, щоб перетворити a 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>
is.na
,as.data.frame
, ...) не прийнято в інших мовах програмування, але мені це подобається.