%op% 运算符是什么意思?例如,“%in%”?

What do the %op% operators in mean? For example "%in%"?

提问人:heavy rocker dude 提问时间:10/4/2012 最后编辑:Jaapheavy rocker dude 更新时间:1/1/2021 访问量:50602

问:

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

%in%在以下代码中是什么意思?

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

如何查找有关 %in% 和遵循该模式的类似函数的帮助,因为我找不到帮助文件?%stuff%

相关问题:

语法 运算符 R-FAQ

评论

1赞 Ari B. Friedman 10/5/2012
另请参阅 stackoverflow.com/questions/1328903/what-does-eg-do-in-r?rq=1

答:

31赞 GSee 10/4/2012 #1

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

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

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

'%in%' 当前定义为

'“%in%” <- 函数(x, 表) match(x, table, nomatch = 0) > 0'


由于是泛型,我不知道什么返回,不知道是什么。但是,告诉您左侧的哪些项目也在右侧。timetime(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

评论

0赞 heavy rocker dude 10/4/2012
那么:which(time(X2)%in%time(Y)) 基本上返回 X2 和 Y 之间的较大日期?感谢两位的回答
0赞 ESL 6/10/2021
这并没有回答原始问题,关于%op%(自定义中缀运算符),只是回答了示例的含义(没有问到什么)。🤷🏻‍♂️🤦🏻‍♂️
2赞 Sathish 10/5/2012 #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 

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

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:从列中子集多个值 有关示例,请参阅此站点

21赞 Ari B. Friedman 10/5/2012 #3

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

例如:

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

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

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

评论

0赞 Sathish 10/5/2012
另一个这样的用户定义的二进制运算符是 %*%,它执行真正的矩阵乘法,而运算符 * 只执行数据的矢量化计算。
1赞 Ari B. Friedman 10/5/2012
@Sathish 注意,尽管我将 %*%、%in% 等称为“非用户定义的”或“内置”运算符。
0赞 Coruscate5 7/18/2017
尽管理解了评分较高的答案,但这个答案的这种直截了当的帮助令人惊讶
58赞 IRTFM 10/5/2012 #4

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

 `%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)

-character 在解析 Date、date-time 和 C 型格式函数(如 和 )时也很重要。%strptimeformatCsprintf

自从最初编写以来,我们已经看到了该包的出现,其详细说明演示了 -flanked 运算符的另一种用途。magrittrdplyr%

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

评论

1赞 vasili111 3/18/2019
很好的解释!另外,有用的链接: datamentor.io/r-programming/infix-operator 您知道任何带有 inflix 操作员解释的官方文档吗?
2赞 IRTFM 3/18/2019
在 R 语言定义中搜索“运算符”、“组方法”、“特殊运算符”以及“中缀和前缀运算符”。
39赞 12 revs, 6 users 93%Richie Cotton #5

%op%表示中缀二进制运算符。有几个内置运算符使用 ,您也可以创建自己的运算符。%

(单个符号不是 R 中的关键字。您可以在 ?保留帮助页面。%


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

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

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

图片来源:GSee的回答


%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的回答,Ari的回答,Sathish的回答


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

这些是函数,可以像定义任何其他函数一样,但有一些限制。

  1. 它是一个二进制操作器,因此该函数必须正好接受两个参数。
  2. 由于名称是非标准的,因此必须用引号或反引号书写。

例如,这定义了一个矩阵幂运算符。

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

matrix(1:4, 2) %^% 3

图片来源:BondedDust 的回答,Ari 的回答


还有哪些其他 % 运算符?

基础 R 中:

%/%并分别进行整数除法和模除法,并在 ?算术帮助页面。%%

%o% 给出数组的外积

%*%执行矩阵乘法

%x% 执行数组的 Kronecker 乘积

ggplot2 中:

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

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

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

%||%(internal) 在值的情况下提供默认值。此函数也出现在 devtools、reshape2、roxygen2 和 knitr 内部。(在 knitr 中,它被称为 。NULL%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
)

评论

2赞 smci 8/17/2018
精湛的总结。这应该是公认的答案。