%op%运营商的意思是什么?例如“%in%”?

时间:2012-10-04 15:26:14

标签: r syntax operators r-faq

我尝试进行这种简单的搜索,但在R中的百分比(%)符号上找不到任何内容。

以下代码中%in%的含义是什么?

time(x) %in% time(y)其中xy是矩阵。

如何按照%in%模式查找%stuff%和类似功能的帮助,因为找不到帮助文件?

相关问题:

5 个答案:

答案 0 :(得分:49)

我不认为GSee或Sathish的答案足够远,因为“%”确实本身具有意义,而不仅仅是%in%运算符的上下文。它是用户定义新的中缀运算符的机制。这是一个比%in%中缀运算符或其更一般的前缀祖先match的优点更普遍的问题。它可以像制作(s)um运算符一样简单

 `%s%` <- function(x,y) x + y

或者它可能更有趣,比如做一个二阶导数运算符:

 `%DD%` <- function(expr, nam="x") { D(D( bquote(.(expr)), nam), nam) }
 expression(x^4) %DD% "x"
 # 4 * (3 * x^2)

% - 字符在解析日期,日期时间和C类型格式函数时也很重要,例如strptimeformatCsprintf。< / p>

由于这是最初编写的,我们已经看到了magrittr包的出现以及dplyr详细说明,它展示了%侧翼操作符的另一种用法。

所以最常见的答案是%符号由R解析器专门处理。由于解析器用于处理plotmath表达式,因此您还可以在?plotmath帮助页面上看到图形注释的大量选项。

答案 1 :(得分:26)

在其周围加上引号以查找帮助页面。这些工作中的任何一个

> help("%in%")
> ?"%in%"

进入帮助页面后,您会看到

  

'%in%'目前定义为

     

'“%in%”&lt; - function(x,table)match(x,table,nomatch = 0)&gt; 0’


由于time是通用的,我不知道time(X2)返回的内容,而不知道X2是什么。但是,%in%会告诉您左侧的哪些项目也在右侧。

> c(1:5) %in% c(3:8)
[1] FALSE FALSE  TRUE  TRUE  TRUE

另见intersect

> intersect(c(1:5), c(3:8))
[1] 3 4 5

答案 2 :(得分:24)

%op%表示 infix binary operator 。有几个使用%的内置运算符,您也可以创建自己的运算符。

(单个%符号不是R中的关键字。您可以在?Reserved帮助页面上看到关键字列表。)


如何获得有关二元运算符的帮助?

与任何不是标准变量名称的内容一样,您必须将该术语括在引号或反引号中。

?"%in%"
?`%in%`    

信用:GSee's answer


%in%做什么?

正如?`%in%`帮助页面(实际上是?match帮助页面上所述,因为%in%实际上只是match的中缀版本。),

  

[%in%]返回一个逻辑向量,指示其左操作数是否匹配

它最常用于分类变量,但它也可以与数字一起使用。

c("a", "A") %in% letters
## [1]  TRUE FALSE

1:4 %in% c(2, 3, 5, 7, 11)
## [1] FALSE  TRUE  TRUE FALSE

信用:GSee's answerAri's answerSathish's answer


如何创建自己的中缀二元运算符?

这些是函数,可以使用与任何其他函数相同的方式定义,但有一些限制。

  1. 它是二进制 opertor,因此该函数必须使用两个参数。
  2. 由于名称是非标准的,因此必须使用引号或反引号进行编写。
  3. 例如,这定义了矩阵幂运算符。

    `%^%` <- function(x, y) matrixcalc::matrix.power(x, y)
    
    matrix(1:4, 2) %^% 3
    

    信用:BondedDust's answerAri's answer


    还有哪些%运营商?

    基础R:

    %/%%%分别执行integer divisionmodular division,并在?Arithmetic帮助页面上进行了描述。

    %o%提供outer product数组。

    %*%执行matrix multiplication

    %x%执行Kronecker product数组。

    ggplot2

    %+%替换了ggplot中的数据框。

    %+replace%修改ggplot中的主题元素。

    %inside%(内部)检查范围内的值。

    %||%(内部)在NULL值的情况下提供默认值。此功能也出现在devtools,reshape2,roxygen2和knitr内部。 (在knitr中,它被称为%n%。)

    magrittr

    %>%将左侧管道输入右侧的表达式。

    %<>%将左侧管道输入右侧的表达式,然后将结果分配回左侧对象。

    %T>%将左侧的管道输入右侧的表达式,仅用于其副作用,返回左侧。

    %,%构建了一个功能序列。

    %$%公开data.frame的列或列表的成员。

    data.table:

    %between%检查范围内的值。

    %chin%%in%类似,针对字符向量进行了优化。

    %like%检查正则表达式匹配。

    Hmisc:

    %nin%返回%in%的反面。

    devtools

    %:::%(internal)从作为字符串传递的命名空间中获取变量。

    sp

    %over%执行空间连接(例如,哪个多边形对应于某些点?)

    rebus

    %R%连接regex对象的元素。


    更一般地说,您可以使用以下命令查找计算机上安装的所有软件包中的所有操作员:

    library(magrittr)
    
    ip <- installed.packages() %>% rownames
    (ops <- setNames(ip, ip) %>% 
      lapply(
        function(pkg)
        {
          rdx_file <- system.file("R", paste0(pkg, ".rdx"), package = pkg)
          if(file.exists(rdx_file))
          {
            rdx <- readRDS(rdx_file)
            fn_names <- names(rdx$variables)
            fn_names[grepl("^%", fn_names)]
          }
        }
      ) %>% 
      unlist
    )
    

答案 3 :(得分:21)

更一般地说,%foo%是二元运算符的语法。 R中的二元运算符实际上只是伪装的函数,并且取两个参数(前一个和运算符后面的一个参数成为函数的前两个参数)。

例如:

> `%in%`(1:5,4:6)
[1] FALSE FALSE FALSE  TRUE  TRUE

虽然在基数R中定义%in%,但您也可以定义自己的二进制函数:

`%hi%` <- function(x,y) cat(x,y,"\n")
> "oh" %hi% "my"
oh my 

答案 4 :(得分:2)

%in%是一个运算符,用于查找矩阵或数据框中相同名称或值的多次出现并将其子集化。

例如1:具有相同名称的子集

set.seed(133)
x <- runif(5)
names(x) <- letters[1:5]
x[c("a", "d")]
#  a         d 
#  0.5360112 0.4231022

现在您将“d”的名称更改为“a”

 names(x)[4] <- "a"

如果您尝试使用前面的下标提取相似的名称及其值,则无法使用。注意结果,它没有[1]和[4]的元素。

x[c("a", "a")]

#        a         a 
#    0.5360112 0.5360112 

因此,您可以使用%in%二元运算符从变量中的不同位置提取两个“a”。

names(x) %in% "a"
#  [1]  TRUE FALSE FALSE  TRUE FALSE

#assign it to a variable called "vec"
 vec <- names(x) %in% "a"

#extract the values of two "a"s
 x[vec]
 #         a         a 
 #  0.5360112 0.4231022 

示例2:从列中设置多个值 请参阅this site以获取示例