Крапка в назві функції може означати будь-що з наступного:
- нічого взагалі
- роздільник між методом і класом у методах 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, ...) не прийнято в інших мовах програмування, але мені це подобається.