Ответ 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
.