Что означает «.» (Точка) в R?


39

Я просто читаю книгу "R в двух словах". И кажется, что я пропустил часть, где "." как в "sample.formula" было объяснено.

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

Образец - это объект с формулой поля, как в других языках? И если так, как я могу узнать, какие еще поля / функции у этого объекта? (Объявление типа)

РЕДАКТИРОВАТЬ: я только что нашел другое запутанное использование ".":

> 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в отношении .Вот соответствующие биты:

Есть две специальные интерпретации. в формуле. Обычный находится в контексте аргумента данных функций подгонки модели и означает «все столбцы, в формуле нет других формул»: см. Термин. Формула. Только в контексте update.formula это означает «что ранее было в этой части формулы».

С другой стороны , reshapeи reshape2пакеты используют .и ...немного по- другому (от ?cast):

Есть пара специальных переменных: «...» представляет все остальные переменные, не используемые в формуле, и «.» не представляет переменную


5

Есть некоторые исключения (диспетчеризация метода S3), но, как правило, они просто используются как вспомогательные средства для чтения и, как таковые, не имеют особого значения.


2
Я бы сказал обратное - оно имеет особое значение (упомянутое вами диспетчеризация S3), но некоторые старые соглашения об именах приводили к тому, что имена функций, которые не являются универсальными S3, имели имена, включающие a .. Это относится к именам функций. Что касается имен (нефункциональных) объектов, то да, особого смысла нет.
Восстановить Монику - Г. Симпсон

В начале имени, объект .делает объект невидимым для ls()хотя.
Каракал

2

Точка в sample.formula не отделяет образец от формулы , кроме как визуально. Это просто имя переменной. Имена переменных R могут состоять из буквенно-цифровых символов и точки (.) И подчеркивания (_) с одним исключением. Вот собственно правило:

« Синтаксически допустимое имя состоит из букв, цифр и точки или подчеркивания и начинается с буквы или точки, за которой не следует число. Такие имена, как« .2way », недопустимы и не являются зарезервированными словами ».

Второй случай (т. Е. Случай is_spam ~. ) Отличается и объясняется выше.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.