42-*_*42- 51
我不认为GSee或Sathish的答案足够远,因为"%" 本身就具有意义,而不仅仅是在%in%运算符的上下文中.它是用户定义新的中缀运算符的机制.这是一个比中%in%缀运算符或其更一般的前缀祖先的优点更普遍的问题match.它可以像制作一个(s)um运算符一样简单
`%s%` <- function(x,y) x + y
Run Code Online (Sandbox Code Playgroud)
或者它可能更有趣,比如做一个二阶导数运算符:
`%DD%` <- function(expr, nam="x") { D(D( bquote(.(expr)), nam), nam) }
expression(x^4) %DD% "x"
# 4 * (3 * x^2)
Run Code Online (Sandbox Code Playgroud)
该%字符数限制也有重要的日期,日期时间的解析,和C型格式的功能,如strptime,formatC和sprintf.
由于这是最初编写的,我们已经看到了magrittr包的出现,其中dplyr详细说明了另一个用于%-flanked运算符的用法.
所以最常见的答案是%符号由R解析器专门处理.由于解析器用于处理plotmath表达式,因此您还可以在?plotmath帮助页面上看到图形注释的大量选项.
GSe*_*See 26
在它周围加上引号以找到帮助页面.这些都是工作
> help("%in%")
> ?"%in%"
Run Code Online (Sandbox Code Playgroud)
进入帮助页面后,您会看到
'%in%'目前定义为
'"%in%"< - function(x,table)match(x,table,nomatch = 0)> 0'
既然time是通用的,我time(X2)不知道什么X2是不知道是什么.但是,%in%告诉你左手边的哪些物品也在右手边.
> c(1:5) %in% c(3:8)
[1] FALSE FALSE TRUE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
也可以看看, intersect
> intersect(c(1:5), c(3:8))
[1] 3 4 5
Run Code Online (Sandbox Code Playgroud)
Ric*_*ton 24
%op%表示中缀 二元运算符.有几个内置运算符使用%,您也可以创建自己的运算符.
(单个%符号不是R中的关键字.您可以在?Reserved帮助页面上看到关键字列表.)
我如何获得二元运算符的帮助?
与任何非标准变量名称一样,您必须将该术语括在引号或反引号中.
?"%in%"
?`%in%`
Run Code Online (Sandbox Code Playgroud)
图片来源: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
Run Code Online (Sandbox Code Playgroud)
信用:GSee的回答,Ari的回答,Sathish的回答.
如何创建自己的中缀二进制运算符?
这些是函数,可以使用与任何其他函数相同的方式定义,但有一些限制.
例如,这定义了矩阵幂运算符.
`%^%` <- function(x, y) matrixcalc::matrix.power(x, y)
matrix(1:4, 2) %^% 3
Run Code Online (Sandbox Code Playgroud)
信用:BondedDust的回答,Ari的回答.
还有哪些其他%运营商?
在基地R:
%/%并分别%%执行整数除法和模块划分,并在?Arithmetic帮助页面上进行了描述.
%x%执行阵列的Kronecker产品.
在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
)
Run Code Online (Sandbox Code Playgroud)
Ari*_*man 21
更一般地说,%foo%是二元运算符的语法.R中的二元运算符实际上只是伪装的函数,并且取两个参数(前一个和运算符后面的一个参数成为函数的前两个参数).
例如:
> `%in%`(1:5,4:6)
[1] FALSE FALSE FALSE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
虽然%in%在基础R中定义,但您也可以定义自己的二进制函数:
`%hi%` <- function(x,y) cat(x,y,"\n")
> "oh" %hi% "my"
oh my
Run Code Online (Sandbox Code Playgroud)