46

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

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

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

%in%%stuff%由于找不到帮助文件,如何查找有关遵循该模式类似功能的帮助?

相关问题:

4

5 回答 5

57

我认为 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.

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

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

于 2012-10-04T16:24:19.240 回答
35

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

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


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

与任何非标准变量名一样,您必须将术语括在引号或反引号中。

?"%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 中:

%/%并分别%%进行整数除法模除法,在?Arithmetic帮助页面上有说明。

%o%给出数组的外积.

%*%执行矩阵乘法

%x%执行数组的Kronecker 积

ggplot2 中

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

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

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

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

magrittr 中

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

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

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

%,%构建功能序列。

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

数据表中:

%between%检查范围内的值。

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

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

Hmisc 中:

%nin%返回 的相反数%in%

开发工具中:

%:::%(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
)
于 2014-09-14T10:21:42.490 回答
30

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

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

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

'%in%' 当前定义为

'"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0'</p>


由于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
于 2012-10-04T15:28:27.003 回答
21

更一般地说,%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 
于 2012-10-04T16:17:09.670 回答
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:将列中的多个值设置为子集 请参阅此站点以获取示例

于 2012-10-04T16:00:55.867 回答