%op% 运算符是啥意思?例如“%in%”?

Posted

技术标签:

【中文标题】%op% 运算符是啥意思?例如“%in%”?【英文标题】:What do the %op% operators in mean? For example "%in%"?%op% 运算符是什么意思?例如“%in%”? 【发布时间】:2012-09-25 16:30:16 【问题描述】:

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

下面代码中的%in%是什么意思?

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

由于找不到帮助文件,如何查找有关 %in% 和遵循 %stuff% 模式的类似函数的帮助

相关问题:

What does eg %+% do? in R The R %*% operator What does %*% mean in R What does %||% do in R? What does %>% mean in R

【问题讨论】:

另见***.com/questions/1328903/what-does-eg-do-in-r?rq=1 【参考方案1】:

我认为 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)中也很重要。

自从最初编写以来,我们已经看到带有 dplyr 详细说明的 magrittr 包的出现,它展示了 %-flanked 运算符的另一种用途。

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

【讨论】:

很好的解释!另外,有用的链接:datamentor.io/r-programming/infix-operator你知道任何官方文档解释了 inflix 操作符吗? 在 R 语言定义中搜索“运算符”、“组方法”、“特殊运算符”和“中缀和前缀运算符”。【参考方案2】:

%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 answer、Ari's answer、Sathish's answer。


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

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

    它是一个 二进制 操作符,所以该函数必须正好有两个参数。 由于名称不规范,所以必须用引号或反引号书写。

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

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

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

信用:BondedDust's answer,Ari's answer。


还有哪些% 运算符?

基础 R:

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

%o% 给出数组的outer product。

%*% 执行matrix multiplication。

%x% 执行数组的Kronecker product。

ggplot2:

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

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

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

%||%(内部)在NULL 值的情况下提供默认值。这个函数也出现在 devtools、reshape2、roxygen2 和 knitr 内部。 (在 knitr 中称为%n%。)

magrittr:

%&gt;% 将左侧通过管道传递到右侧的表达式中。

%&lt;&gt;% 将左侧通过管道传递到右侧的表达式中,然后将结果分配回左侧的对象。

%T&gt;% 将左侧通过管道传递到右侧的表达式中,它仅用于其副作用,返回左侧。

%,% 构建函数序列。

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

data.table:

%between% 检查范围内的值。

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

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

Hmisc:

%nin% 返回 %in% 的反义词。

开发工具中:

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

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】:

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

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

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

'%in%' 当前定义为

'"%in%" 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

【讨论】:

那么:which(time(X2)%in%time(Y)) 基本上返回 X2 和 Y 之间的较大日期?感谢两位的回答 这里不回答原始问题,关于%op%(自定义中缀运算符),只是回答了例子的意思(没有问什么)。 ??‍♂️??‍♂️【参考方案4】:

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

例如:

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

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

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

【讨论】:

另一个这样的用户定义的二元运算符是 %*%,它执行真正的矩阵乘法,而运算符 * 仅对数据进行矢量化计算。 @Sathish 注意,尽管我将 %*%、%in% 等称为“非用户定义”或“内置”运算符。 尽管理解评分较高的答案,但这种直截了当的答案非常有用【参考方案5】:

%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

【讨论】:

以上是关于%op% 运算符是啥意思?例如“%in%”?的主要内容,如果未能解决你的问题,请参考以下文章

=> 运算符在 Swift 中是啥意思?

c++程序中->second 是啥意思

逻辑运算 ⊙ & 小圆圈里一个加号 是啥意思

$ 在 Haskell 中是啥意思/做啥?

java中这个符号“=”是啥意思?

C语言左位移运算符和右位移运算符是啥意思,怎么运算,举个例子..