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

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

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

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

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

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

Ответы

Ответ 1

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

  • . используется поиск в реализациях универсальных методов S3. Например, если вы вызываете универсальную функцию, такую как plot с объектом класса lm в качестве первого параметра, тогда она будет искать функцию с именем 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

Ответ 2

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

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

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

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

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