我了解==
和!=
等基础知识,甚至&
和&&
之间的差异(含糊不清)。但是%in%
和%%
等内容以及sprintf()
上下文中使用的一些内容,如sprintf("%.2f", x)
我不知道的内容。
最糟糕的是,他们很难在互联网上搜索,因为他们是特殊角色,我不知道他们叫什么......
答案 0 :(得分:34)
这里有几个不同的东西,百分号:
正如一些人已经指出的那样,%%
,%in%
,%*%
形式的东西是二元运算符(分别是模数,匹配和矩阵乘法),就像{{{ 1}},+
等。它们是对两个参数进行操作的函数,由于它们的名称结构(以-
开头和结尾),R认为这两个参数是特殊的。这允许您以表格形式使用它们:
%
而不是更传统的:
Argument1 %fun_name% Argument2
请注意以下内容是等效的:
fun_name(Argument1, Argument2)
R只识别标准运算符以及10 %% 2 == `%%`(10, 2)
"hello" %in% c("hello", "world") == `%in%`("hello", c("hello", "world"))
10 + 2 == `+`(10, 2)
运算符作为特殊运算符,并允许您将它们用作传统二元运算符(如果您不引用它们)。如果引用它们(在上面的示例中使用反引号),则可以将它们用作标准的两个参数函数。
标准二元运算符和%x%
运算符之间的最大区别在于,您可以定义自定义二元运算符,R会将它们识别为特殊运算符并将它们视为二元运算符:
%x%
这里我们定义了样本函数的二元运算符版本
`%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
参数的特殊说明混合使用。
答案 1 :(得分:4)
R Language Definition,3.1.4部分将它们称为&#34;特殊二元运算符&#34;。他们特别的一种方式是用户可以使用%x%
语法定义新的二元运算符(其中x
是任何有效名称)。
Writing your own functions的An Introduction to R部分将它们称为Binary Operators(这有点令人困惑,因为+
也是二元运算符):
10.2定义新的二元运算符
我们给
bslash()
函数一个不同的名字,即其中一个 形式%any%
它可以在表达式中用作二元运算符 而不是功能形式。例如,假设我们选择!对于 内在的性格。然后函数定义将以
开头&GT; &#34;%!%&#34; &lt; - function(X,y){...}
(注意使用引号。)然后可以将该函数用作X%!%y。 (反斜杠符号本身 不是一个方便的选择,因为它在这方面存在特殊问题 上下文。)
矩阵乘法运算符,%*%和外积矩阵 operator%o%是此中定义的二元运算符的其他示例 方式。
答案 2 :(得分:3)
据我所知,他们没有特别的名字。它们在R operator syntax and precedence中描述。
%anything%
运算符只是普通函数,可以由您自己定义。你需要将操作符的名称放在反引号(`…`
)中,但是:这就是R处理特殊名称的方式。
`%test%` = function (a, b) a * b
2 %test% 4
# 8
sprintf
格式字符串完全不相关,它们根本不是运算符。相反,它们只是传统的C-style format strings。
答案 3 :(得分:3)
帮助文件和general entry确实是一个很好的起点:?'%in%'
例如,您可以看到如何定义运算符'%in%'
:
"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0
您甚至可以创建自己的运算符:
'%ni%' <- Negate('%in%')