R:什么是%in in%的运算符,我怎样才能了解它们?

时间:2014-08-07 09:55:20

标签: r operators special-characters symbols

我了解==!=等基础知识,甚至&&&之间的差异(含糊不清)。但是%in%%%等内容以及sprintf()上下文中使用的一些内容,如sprintf("%.2f", x)我不知道的内容。

最糟糕的是,他们很难在互联网上搜索,因为他们是特殊角色,我不知道他们叫什么......

4 个答案:

答案 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 Definition3.1.4部分将它们称为&#34;特殊二元运算符&#34;。他们特别的一种方式是用户可以使用%x%语法定义新的二元运算符(其中x是任何有效名称)。

Writing your own functionsAn 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%')