Что. (точка) и% (процент) означают в R?

Мой вопрос может показаться глупым, но я заметил, что . а также % часто используется в R и, честно говоря, я не знаю, почему это используется.

Я видел это в dplyr (иди сюда для примера) и data.table (т.е. .SD) но я уверен, что это должно быть использовано и в другом месте.

Поэтому мой вопрос:

  • Что значит . имею в виду? Это какой-то R кодирование наилучшей практики номенклатуры? (т.е. _functionName часто используется в javascript указать, что это частная функция). Если да, каково правило?
  • Тот же вопрос для %, который также часто используется в R (т.е. %in%,%>%,...).

Мое предположение всегда было таким . а также % это удобный способ быстро вызвать функцию, но способ data.table использования . не следует этой логике, которая меня смущает.

2 ответа

Решение

. не имеет никакого врожденного / магического значения в R. Это просто еще один символ, который вы можете использовать в именах символов. Но так как его так удобно печатать, ему придавалось особое значение определенными функциями и соглашениями в R. Вот лишь несколько

  • . используется поиск в реализациях универсальных методов S3. Например, если вы вызываете универсальную функцию, такую ​​как plot с объектом класса lm в качестве первого параметра, он будет искать функцию с именем plot.lm и, если найден, позвоните.
  • довольно часто . в формулах означает "все остальные переменные", например, lm(y~., data=dd) будет регресс y на всех других переменных в data.frame dd,
  • библиотеки как dplyr используйте его как специальное имя переменной, чтобы указать текущий data.frame для таких методов, как do(), Они могли бы также легко использовать имя переменной X вместо
  • функции как bquote использование .() как специальная функция для экранирования переменных в выражениях
  • Переменные, начинающиеся с точки, считаются скрытыми и не отображаются с ls() если вы не позвоните ls(all.names=TRUE) (аналогично поведению файловой системы UNIX)

Тем не менее, вы также можете просто определить переменную с именем my.awesome.variable<-42 и он будет работать так же, как и любая другая переменная.

% само по себе ничего особенного не означает, но R позволяет вам определять свои собственные инфиксные операторы в виде %<something>% используя два знака процента. Если вы определите

`%myfun%` <- function(a,b) {
    a*3-b*2
}

Вы можете назвать это как

5 %myfun% 2
# [1] 11

Ответ MrFlick не распространяется на использование . в data.table;

В data.table, . является (по существу) псевдонимом для listтак что любой * вызов [.data.table который принимает list также может быть передан объект, завернутый в .(),

Таким образом, следующее эквивалентно:

DT[ , .(x, y)]
DT[ , list(x, y)]

* ну, не совсем. любое использование в аргументе j, да; в другом месте идет работа, смотрите здесь.

Другие вопросы по тегам