R: Какие операторы называют% в%, и как я могу узнать о них?

Я знаю основы, такие как == и !=, или даже различие (неопределенно) между & и &&. Но такие вещи, как %in% и %%, и некоторые вещи, используемые в контексте sprintf(), например, sprintf("%.2f", x), о которых я не знаю.

Хуже всего, их трудно найти в Интернете, потому что они специальные персонажи, и я не знаю, что они называются...

Ответ 1

Здесь есть несколько разных вещей с символом процента:

Двоичные операторы

Как уже отмечалось, вещи вида %%, %in%, %*% являются бинарными операторами (соответственно по модулю, совпадению и умножению матрицы), как и +, -, и т.д. Это функции, которые работают по двум аргументам, которые R распознает как особые из-за их структуры имен (начинается и заканчивается на %). Это позволяет использовать их в форме:

Argument1 %fun_name% Argument2

вместо более традиционного:

fun_name(Argument1, Argument2)

Имейте в виду, что следующие эквиваленты:

10 %% 2 == `%%`(10, 2)
"hello" %in% c("hello", "world") == `%in%`("hello", c("hello", "world"))
10 + 2 == `+`(10, 2)

R просто распознает стандартные операторы, а также операторы %x% как специальные и позволяет использовать их в качестве традиционных двоичных операторов, если вы их не процитируете. Если вы их цитируете (в приведенных выше примерах с обратными выводами), вы можете использовать их в качестве стандартных двух функций аргументов.

Пользовательские двоичные операторы

Большая разница между стандартными двоичными операторами и операторами %x% заключается в том, что вы можете определить пользовательские двоичные операторы, а R будет распознавать их как специальные и рассматривать их как двоичные операторы:

`%samp%` <- function(e1, e2) sample(e1, e2)
1:10 %samp% 2
# [1] 1 9

Здесь мы определили бинарный оператор-вариант примерной функции

"%" (Процент) в качестве токена в специальной функции

Значение "%" в функции типа sprintf или format совершенно различно и не имеет ничего общего с бинарными операторами. Главное, что в этих функциях символ % является частью строки с кавычками, а не стандартный символ в командной строке (т.е. "%" и % очень разные). В контексте sprintf внутри строки "%" является специальным символом, используемым для распознавания того, что последующие символы имеют особое значение и не должны интерпретироваться как обычный текст. Например, в:

sprintf("I'm a number: %.2f", runif(3))
# [1] "I'm a number: 0.96" "I'm a number: 0.74" "I'm a number: 0.99"

"%.2f" означает число с плавающей запятой (f), которое будет отображаться с двумя десятичными знаками ( .2). Обратите внимание, как буква "I'm a number: " интерпретируется буквально. Использование "%" позволяет пользователям sprintf смешивать литеральный текст со специальными инструкциями о том, как представить другие аргументы sprintf.

Ответ 2

Определение языка R, раздел 3.1.4 относится к ним как к "специальным двоичным операторам". Один из способов, которыми они являются особыми, заключается в том, что пользователи могут определять новые двоичные операторы, используя синтаксис %x% (где x - любое допустимое имя).

Написание собственных функций в разделе Введение в R, относится к ним как Двоичные операторы (что несколько запутывает, потому что + также является двоичным оператором):

10.2 Определение новых двоичных операторов

Если бы мы дали функции bslash() другое имя, а именно одно из форма

% ничего%

он мог быть использован как двоичный оператор в выражениях а не в форме функций. Предположим, например, выберем! для внутренний характер. Тогда определение функции начнется как

> "%!%" < - функция (X, y) {...}

(Обратите внимание на использование меток кавычек.) Затем эту функцию можно использовать как X%!% y. (Сам символ обратной косой черты это не удобный выбор, поскольку он представляет особые проблемы в этом контекст).

Оператор матричного умножения,% *% и внешняя матрица произведения оператор% o% - другие примеры бинарных операторов, определенных в этом путь.

Ответ 3

У них нет специального имени, насколько я знаю. Они описаны в синтаксисе оператора оператора и приоритете.

Операторы %anything% - это просто нормальные функции, которые можно определить самостоятельно. Вам нужно указать имя оператора в backticks (`…`), хотя: так R обрабатывает специальные имена.

`%test%` = function (a, b) a * b

2 %test% 4
# 8

Строки формата sprintf полностью не связаны друг с другом, они вовсе не являются операторами. Вместо этого они являются обычными строками формата C.

Ответ 4

Файл справки и общая запись, действительно хорошая отправная точка: ?'%in%'

Например, вы можете видеть, как определяется оператор '%in%':

"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0

Вы даже можете создать своих собственных операторов:

'%ni%' <- Negate('%in%')