运算符是一个符号,通知编译器执行特定的数学或逻辑操作。 R语言具有丰富的内置运算符,并提供以下类型的运算符。
运算符的类型
R语言中拥有如下几种运算符类型:
算术运算符
关系运算符
逻辑运算符
赋值运算符
其他运算符
算术运算符
下表显示了R语言支持的算术运算符。 操作符对向量的每个元素起作用。
运算符 描述 例
关系运算符
下表显示了R语言支持的关系运算符。 将第一向量的每个元素与第二向量的相应元素进行比较。 比较的结果是布尔值。
运算符 描述 例
逻辑运算符
下表显示了R语言支持的逻辑运算符。 它只适用于逻辑,数字或复杂类型的向量。 所有大于1的数字被认为是逻辑值TRUE。
将第一向量的每个元素与第二向量的相应元素进行比较。 比较的结果是布尔值。
运算符 描述 例
& 它被称为元素逻辑AND运算符。 它将第一向量的每个元素与第二向量的相应元素组合,并且如果两个元素都为TRUE,则给出输出TRUE。
v <- c(3,1,TRUE,2+3i)
t <- c(4,1,FALSE,2+3i)
print(v&t)
它产生以下结果 -
TRUE TRUE FALSE TRUE
| 它被称为元素逻辑或运算符。 它将第一向量的每个元素与第二向量的相应元素组合,并且如果元素为真,则给出输出TRUE。
v <- c(3,0,TRUE,2+2i)
t <- c(4,0,FALSE,2+3i)
print(v|t)
它产生以下结果 -
TRUE FALSE TRUE TRUE
! 它被称为逻辑非运算符。 取得向量的每个元素,并给出相反的逻辑值。
v <- c(3,0,TRUE,2+2i)
print(!v)
它产生以下结果 -
FALSE TRUE FALSE FALSE
逻辑运算符&&和|| 只考虑向量的第一个元素,给出单个元素的向量作为输出。
运算符 描述 例
&& 称为逻辑AND运算符。 取两个向量的第一个元素,并且只有两个都为TRUE时才给出TRUE。
v <- c(3,0,TRUE,2+2i)
t <- c(1,3,TRUE,2+3i)
print(v&&t)
它产生以下结果 -
TRUE
|| 称为逻辑OR运算符。 取两个向量的第一个元素,如果其中一个为TRUE,则给出TRUE。
v <- c(0,0,TRUE,2+2i)
t <- c(0,3,TRUE,2+3i)
print(v||t)
它产生以下结果 -
FALSE
赋值运算符
这些运算符用于向向量赋值。
运算符 描述 例
<−
or
=
or
<<−
称为左分配
v1 <- c(3,1,TRUE,2+3i)
v2 <<- c(3,1,TRUE,2+3i)
v3 = c(3,1,TRUE,2+3i)
print(v1)
print(v2)
print(v3)
它产生以下结果 -
3+0i 1+0i 1+0i 2+3i
3+0i 1+0i 1+0i 2+3i
3+0i 1+0i 1+0i 2+3i
->
or
->>
称为右分配
c(3,1,TRUE,2+3i) ->v1
c(3,1,TRUE,2+3i) ->>v2
print(v1)
print(v2)
它产生以下结果 -
3+0i 1+0i 1+0i 2+3i
3+0i 1+0i 1+0i 2+3i
其他运算符
这些运算符用于特定目的,而不是一般的数学或逻辑计算。
运算符 描述 例
: 冒号运算符。 它为向量按顺序创建一系列数字。
v <- 2:8
print(v)
它产生以下结果 -
2 3 4 5 6 7 8
%in%此运算符用于标识元素是否属于向量。
v1 <- 8
v2 <- 12
t <- 1:10
print(v1 %in% t)
print(v2 %in% t)
它产生以下结果 -
TRUE
FALSE
% % 此运算符用于将矩阵与其转置相乘。
M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
t = M % % t(M)
print(t)
它产生以下结果 -
[,1] [,2]
[1,] 65 82
[2,] 82 117
作者:任坤链接:https://www.zhihu.com/question/24908785/answer/29404778
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
R中的 . 符号只是个普通字符,可以在符号名称中出现,下面几种情况中 . 具有特殊含义:
1. 一个 environment 中以 . 开头的变量默认被当作隐藏变量,用 ls.str() 不会被列出来,除非 ls.str(all.names = TRUE) .
2. 一些函数中 . 具有特殊的意义,比如线性模型函数 lm() 的 formula 参数中的 . 符号会被特殊解读,比如 lm(mpg ~ ., data = mtcars) 中 mpg ~ . 这个formula会被lm()解读成在mtcars数据表中以mpg为被解释变量,其他列为解释变量做线性回归模型,在变量很多的情况下可以简化代码,但风险是数据列变化时回归方程也跟着变,有些类似于SQL中使用 select * 的风险。
3. 不同的函数可能让 . 拥有不同的含义,比如dplyr::do()函数中的 . 就是指每个数据行,而magrittr::`%>%`右侧函数参数中出现的 . 是指符号左边的对象,pipeR::`%>>%`右侧表达式中的 . 是指符号左边的对象,rlist::list.map() 函数 expr 参数中的 . 被解读成 implicit lambda expression,表示需要映射的list中的每个元素本身。
4. (感谢
@王雨晨
的回答,差点遗忘了对于R来说最关键的一点).符号被专门用来实现R中一个比较简单的面向对象系统S3的method dispatch,即可以用UseMethod()定义一个方法xyz,那么xyz.class这指xyz方法对于class类型的实现。这种S3面向对象系统比较简单,也容易发生混淆,比如head.data.frame实际上是head对于data.frame类型的实现,但也可以定义head.data方法,然后定义一种frame类型,这样在代码中就会发生混淆。
总而言之,. 符号在一般的变量中只是一个普通符号而已,只不过有些函数用 . 提供特殊用法方便书写或引用,或者用作S3系统中分隔方法与类的字符。
=== 补充 1 ===
R中访问对象中的元素有多种情况,一类是取子集(subsetting),用 [] ,比如一个 list(a=1,b=2) ["a"] 获得 list(a=1),该运算对list, vector等对象有定义,对environment没有定义;还有一类是取元素(extracting),用 [[ ]] ,list(a=1, b=2) [["a"]] 获得元素值 1,这种情况也可以用 $ 来取元素,该计算对于environment有定义,但$对vector无定义。另外还有S4对象,需要用@ 符号来访问slot,背后对应的函数是slot()函数,不过这些也不是定死的,对于自己定义的对象总可以去自己实现 "[", "[[", "$" 等方法来定义如何计算,可以参见我的 renkun-ken/pipeR @ GitHub 扩展包中Pipe对象的 $.Pipe() (pipeR/pipe.R at master · renkun-ken/pipeR · GitHub),就可以动态生成 closure 实现仿佛 jQuery 或者 C# LINQ 一样的以对象为基础的管道操作。