Яке значення слова "." (Крапка) в R?


39

Я просто читаю книгу "Р в горішці". І, здається, я пропустив ту частину, де "". як у "sample.formula" було пояснено.

> sample.formula <- as.formula(y~x1+x2)

Чи зразок об’єкта з формулою поля, як в інших мовах? І якщо так, то як я можу дізнатися, які ще поля / функції має цей об’єкт? (Тип декларації)

EDIT: Я щойно знайшов чергове заплутане використання ".":

> svm(formula = is_spam~., data = spambase.training)

(крапка між ~.,)


Точка, яку ви бачите з is_spam ~. команда означає, що немає пояснювальних змінних. Зазвичай у модельних формулах ви побачите y ~ x, але якщо у вас немає змінної x, y ~. говорить, щоб вгадати значення y, не використовуючи інших змінних. Це те саме, що модельy=β0
Крістофер Аден

12
@Christopher Навпаки, .формула у формулі говорить R використовувати всі змінні у фреймі даних spambase.training(крім is_spam) як предиктори. Модель відповідає . y=β0y ~ 1
каракал

Я попередньо не перевіряв джерела. Дякую за виправлення!
Крістофер Аден

@caracal (+1) Нічого, мені просто цікаво, як це зробити. Дякую!
Томас Левін

Відповіді:


30

Крапка може використовуватися як у звичайній назві. Однак вона має додаткове спеціальне тлумачення. Припустимо, у нас є об'єкт із певним класом:

 a <- list(b=1)
 class(a) <- "myclass"

Тепер оголосимо myfunctionяк стандартний загальний таким чином:

 myfunction <- function(x,...) UseMethod("myfunction")

Тепер оголосимо функцію

 myfunction.myclass <- function(x,...) x$b+1

Тоді крапка має особливе значення. Для всіх об'єктів з myclassвикликом класу

 myfunction(a)

буде фактично функція виклику myfunction.myclass:

 > myfunction(a)
  [1] 2

Це широко використовується в R, найбільш підходящим прикладом є функція summary. У кожного класу є своя summaryфункція, тому коли ви, наприклад, підходите до якоїсь моделі (яка зазвичай повертає об'єкт із певним класом), вам потрібно викликати, summaryі він викликатиме відповідну підсумкову функцію для цієї конкретної моделі.


Я дуже здивований, що ця відповідь була прийнята і настільки високо оцінена, оскільки вона зовсім не відповідає на питання! Він позначає еліпсис ... (який є однією лексемою, а не послідовністю трьох різних) як "крапку", тоді як питання чітко означає крапку . , яка використовується у формулах та назвах абсолютно по-іншому, як правильно описано сучасниками відповідь Чейза.
whuber

3
Ну я не відношусь до еліпсису. Я намагався пояснити, що крапка використовується для відправки методу S3. Родові функції зазвичай мають еліпси, саме тому я їх використовував. Якщо їх видалити з коду, відповідь не зміниться. Я можу лише здогадуватися, що я відповів перед редагуванням, оскільки я би дав іншу відповідь зараз після перечитання органу запитання.
mpiktas

1
Дякую за пояснення. Я думаю, що поява "..." два рази вводило мене в оману, коли ви вважаєте, що ви посилаєтесь на це як "крапку".
whuber

12

Подивіться на довідкову сторінку ?formulaщодо .відповідних бітів:

Існує дві спеціальні інтерпретації. у формулі. Звичайний - це контекст даних аргументу даних функцій підгонки моделі і означає "всі стовпці, не інакше у формулі": див. Terms.formula. Тільки в контексті update.formula це означає "те, що раніше було в цій частині формули".

Крім того, reshapeі reshape2пакети використовують .і ...трохи інакше (від ?cast):

Є пара спеціальних змінних: "..." представляє всі інші змінні, які не використовуються у формулі, та "." не представляє змінної


5

Є деякі винятки (метод відправки S3), але, як правило, він просто використовується як допомога розбірливості, і як такий не має особливого значення.


2
Я б сказав протилежне - воно має особливе значення (відправка, яку ви згадуєте S3), але деякі старі угоди про іменування викликали, що імена функцій, які не є загальними для S3, мають імена, що включають в себе a .. Це стосується назв функцій. Що стосується назв (нефункціональних) об'єктів, то так, особливого значення немає.
Відновіть Моніку - Г. Сімпсон

На початку імені, a .робить об'єкт невидимим, ls()хоча.
каракал

2

Крапка у sample.formula не відокремлює вибірку від формули , крім візуального. Це лише назва змінної. Імена R змінних можуть складатися з буквено-цифрових знаків, крапки (.) Та підкреслення (_) за одним винятком. Ось власне правило:

" Синтаксично дійсне ім'я складається з букв, цифр, символів крапки або підкреслення і починається з літери або крапки, за якою не йде число. Назви, такі як" .2way ", не є дійсними, і не є зарезервованими словами. "

Другий випадок (тобто випадок is_spam ~. ) Інший і пояснюється вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.