R语言七天入门教程二:认识变量与运算符
一、什么是变量
1、变量
顾名思义,我们可以将变量理解为“可以改变的量”,是计算机语言中能储存计算结果或能表示值的抽象概念。这里的值可以是数字,也可以是其他数据类型(例如,字符串,逻辑类型等)。变量在程序运行过程中,其值是可以发生改变的。
2、常量
对于常量,我们可以将其理解为”固定的量“,会直接写在程序中。在程序运行过程中,常量的值不会发生变化。例如,数值123在程序运行过程中永远都是123,而不会变成其他值。
3、变量的命名
对于一个变量,取一个好名字是非常值得引起重视的。在给变量命名时,理应遵循以下准则:尽量避免缩写、变量名要和该变量的含义有联系。在R语言中,有效的变量名称由字母,数字以及点号 . 或下划线 _ 组成,且需以字母或点开头。我们需要完全记住理解这句话,只要我们在命名时永远遵循一个规则即可:变量名以字母开头,用下划线连接各个部分,数字放到变量名末尾。一些典型的变量名如下表所示:
变量名 | 是否正确 | 评价 |
123_name | 错误 | 变量名不能以数字开头 |
abcde | 正确但不规范 | 从变量名看不出变量的含义 |
cur_user_name_list | 正确且规范 | 从变量名可以看出该变量的含义为:当前用户名列表 |
cur_user_name_1 | 正确且规范 | 从变量名可以看出该变量的含义为:当前的一个用户名 |
cur_user_name% | 错误 | %为非法字符 |
在编程中,有一些特殊的字母作为变量名时,通常会具有特殊的含义,总结如下:
变量名 | 特殊含义 |
i, j, k | 循环计数变量 |
temp | 临时变量 |
index | 索引 |
x | 输入或绘图时横轴的数据 |
y | 输出或绘图时纵轴的数据 |
z | 绘图时z轴的数据 |
二、数据类型
在编程语言中,每一个数据都有其对应的数据类型(数据类型可以看作是不同类别的数据,针对不同的数据类型,程序会有不同的处理方式)。在R语言中,基本数据类型包括:数字型、整数型、逻辑型、字符型、复数型、原生型(数据以二进制形式存储和显示,无需了解)。我们可以将这六种基本类型分为三大类:数值(数字型、整数型、复数型)、逻辑型、文本型(字符型)。
1、数字型
数字型(在其他编程语言中也称为数值类型)就是具体的数字,默认取7位有效数字。R语言中,数字型既可以用一般方法表示,例如:256.789,也可以用10的幂表示,例如:12E7, 6.89e-2(分别表示:和)。
2、整数型
对于整数型,其值是整数,需在整数后加L表示,例如:-1L, 67L等。
3、逻辑型
逻辑型(在其他编程语言中也称为布尔类型),其值只有两类,即:TRUE和FALSE。对于逻辑型,既可以直接赋值,也可以通过逻辑表达式来获得。
4、字符型
字符型,即字符串。在R中,字符串需要用单引号或双引号包围表示,例如:‘Hello World!’、“hello world!”。引号中的部分可以是任何内容,单引号和双引号之间可以互相包围,但单引号内不能含有单引号,双引号内不能含有双引号。如下:
字符串表示 | 是否正确 |
“Hello”、‘world’、“‘hello world’”、‘“World”’ | 正确 |
““hello”” | 错误,双引号内不能包含双引号 |
’asdgh’、”asdgh“ | 错误,字符串必须用英文引号包围 |
“asdgh“sadas“asdas” | 正确,引号内可以包含中文引号 |
"asdasd’ | 错误,左侧是双引号,右侧是单引号,不匹配 |
5、复数类型
R语言中支持复数类型和复数类型,复数包含实部和虚部,虚部用i表示,例如:1+5i, -9-6i等。
6、特殊的数据类型
表示方法 | 含义 |
InF | 正无穷 |
-Inf | 负无穷 |
NaN | 不可能的值,通常是由于除以0才出现 |
NULL | 空值,代表的就是数据不存在 |
NA | 缺失,代表这里没有一个值,但位置存在,类似于占位符placeholder |
三、变量的声明与赋值
在任何语言中,变量都需要先声明再使用。不过由于R语言中,变量没有固定的类型, 给已有变量赋值为新的类型, 该变量就变成新的类型。所以R语言直接通过赋值语句来声明并初始化一个变量。在R语言中,赋值通过以下符号来实现:->
、->>
、=
、<-
、<<-
。前两个符号的含义是把左边的值赋给右边,后三个符号的含义是把右边赋值给左边。
例如,下面这段代码的输出结果就是123:
a = 'hello' # 声明一个变量a,并初始化为字符串'hello',此时a的值是'hello'
a = 123 # 将数值123赋值给a,此时a的值是123
a -> b # 把a赋值给b,此时b的值是123
c <- b # 把b赋值给c,此时c的值是123
print(c) # 在控制台中打印c的值
四、代码注释
注释是对代码的解释,R语言只支持单行注释,用#表示,当前行从#开始一直到末尾,所有内容都会被忽略。
通常在编写一段代码后,我们都需要写注释,来说明这段代码的功能。
如果要用多行注释,每一行都用#开头即可,例如:
# 这是我的第一个R语言程序
# 祝每个看到这段代码的人都能好运
test_string = 'Hello World!' # 声明一个变量test_string,并初始化为'Hello World!'
print(test_string) # 在控制台打印test_string,结果为'Hello World!'
# 这段代码结束了。Good luck!
五、常见运算符
R语言中包含四种运算符:算术运算符、关系运算符、逻辑运算符、赋值运算符。优先级依次为:算术运算符>关系运算符>逻辑运算符>赋值运算符,优先级越高,越先运算,括号优先级最高。
1、算术运算符
符号 | 含义 |
+ | 两数相加 |
- | 两数相减 |
/ | 两数相除 |
* | 两数相乘 |
^ | 乘方运算 |
%% | 整除求余 |
%/% | 整除(忽略小数部分) |
算术运算符优先级最高,最先运算,其运算结果为数值。程序例子如下:
a = 10 # 定义一个变量a,并初始化为10
b = 3 # 定义一个变量b,并初始化为3
print(a/b) # 打印a/b的结果,结果为3.333333,共7位有效数字
print(a*b) # 打印a*b的结果,结果为30
print(a*b) # 打印a*b的结果,结果为30
print(a+b) # 打印a+b的结果,结果为13
print(a-b) # 打印a-b的结果,结果为7
print(a^b) # 打印a^b的结果,结果为1000
print(a%%b) # 打印a%%b的结果,结果为1
print(a%/%b) # 打印a%/%b的结果,结果为3
2、关系运算符
符号 | 含义 |
> | 判断左边是否大于右边 |
< | 判断左边是否小于右边 |
== | 判断左右两边是否相等 |
!= | 判断左右两边是否不等 |
>= | 判断左边是否大于等于右边 |
<= | 判断左边是否小于等于右边 |
关系运算符(对于向量而言,是逐元素比较;对于标量而言,直接比较值的大小。有关向量的内容,后面教程会涉及),其运算结果为逻辑值。程序例子如下:
a = 10 # 定义一个变量a,并初始化为10
b = 3 # 定义一个变量b,并初始化为3
print(a>b) # 打印a/b的结果,结果为TRUE
print(a<b) # 打印a*b的结果,结果为FALSE
print(a==b) # 打印a==b的结果,结果为FALSE
print(a!=b) # 打印a+b的结果,结果为TRUE
print(a>=b) # 打印a>=b的结果,结果为TRUE
print(a<=b) # 打印a^b的结果,结果为FALSE
3、逻辑运算符
符号 | 含义 |
& | 元素逻辑与运算符,针对左右两边逐元素进行与操作(类似高中数学的且) |
| | 元素逻辑或运算符,针对左右两边逐元素进行或操作(类似高中数学的或) |
! | 逻辑非运算符,逐元素进行取反操作(类似高中数学的非) |
&& | 逻辑与运算符,针对左右两边的第一个元素进行与操作 |
|| | 逻辑或运算符,针对左右两边的第一个元素进行或操作 |
逻辑运算符(在对于标量进行运算时,&
与&&
,|
与||
没有任何区别;在对于向量进行运算时,&
和|
是逐元素进行运算,&&
和||
是只针对向量的第一个元素进行运算),其运算结果为逻辑值。程序例子如下:
a = TRUE # 定义一个变量a,并初始化为TRUE
b = FALSE # 定义一个变量b,并初始化为FALSE
print(a&b) # 打印a&b的结果,结果为FALSE
print(a|b) # 打印a|b的结果,结果为TRUE
print(!a) # 打印!a的结果,结果为FALSE
print(!b) # 打印!b的结果,结果为TRUE
print(a&&b) # 打印a&&b的结果,结果为FALSE
print(a||b) # 打印a||b的结果,结果为TRUE
另外,在R语言中,非零的值进行逻辑运算时会被当做TRUE,零在进行逻辑运算时会被当做FALSE。所以上述代码初始化a和b也可以用如下语句:
a = 1 # 定义一个变量a,并初始化为1,在进行逻辑运算时,会被当做TRUE来处理
b = 0 # 定义一个变量b,并初始化为0,在进行逻辑运算时,会被当做FALSE来处理
print(a&b) # 打印a&b的结果,结果为FALSE
print(a|b) # 打印a|b的结果,结果为TRUE
print(!a) # 打印!a的结果,结果为FALSE
print(!b) # 打印!b的结果,结果为TRUE
print(a&&b) # 打印a&&b的结果,结果为FALSE
print(a||b) # 打印a||b的结果,结果为TRUE
4、赋值运算符
符号 | 含义 |
<-, <<-, = | 右边赋值给左边 |
->, ->> | 左边赋值给右边 |
赋值运算符优先级最低,最后运算,运算结果为改变变量的值。程序例子如下:
a = 'hello' # 声明一个变量a,并初始化为字符串'hello',此时a的值是'hello'
print(a) # 在控制台中打印a的值,结果为'hello'
a = 123 # 将数值123赋值给a,此时a的值是123
print(a) # 在控制台中打印a的值,结果为123
a -> b # 把a赋值给b,此时b的值是123
print(b) # 在控制台中打印b的值,结果为123
c <- b+1 # 把b+1的结果赋值给c,此时c的值是124
print(c) # 在控制台中打印c的值,结果为124
5、针对复数的有关运算
对于一个复数z,我们可以用R语言自带的函数来求z相关的值。例如,用Re(z)
求z
的实部, 用Im(z)
求z的虚部, 用Mod(z)
或abs(z)
求z的模, 用Arg(z)
求z的辐角, 用Conj(z)
求z的共轭。程序例子如下:
z = 5 + 3i # 声明一个变量,并初始化为复数5+3i
print(Re(z)) # 打印z的实部,结果为5
print(Im(z)) # 打印z的实部,结果为3
print(Mod(z)) # 打印z的模,结果为5.830952,共七位有效数字
print(abs(z)) # 打印z的模,结果为5.830952,共七位有效数字
print(Arg(z)) # 打印z的幅角,结果为0.5404195,共七位有效数字
print(Conj(z)) # 打印z的共轭,结果为5-3i