2.3 变量赋值
虽然计算很美妙,但通常我们要存储结果以供重用。我们可以使用<-
或=
给(本地)变量赋值,虽然由于历史原因,<-
是首选。
x <- 1:5
y = 6:10
现在,我们可以重新使用这些值进行下一步计算:
x + 2 * y - 3
## [1] 10 13 16 19 22
请注意,在给变量x
和y
赋值之前,并不需要声明它们(这和大多数编译语言不一样)。事实上,我们不能声明任何类型,因为在R中不存在这种概念。
变量名可包含字母、数字、点和下划线,但它不能以数字或一个点后跟数字(因为看起来太像一个数字)开头。系统的保留字也是不允许的,如if和for。某些语言环境(locale)下允许非ASCII字母,但是为了代码的可移植性,最好使用以a到z(A到Z)的字母。关于命名规则的细节,请参见帮助页面?make.names
。
赋值运算符两边的空格并不是必须的,但它们有助于提高代码的可读性,尤其是对于<-
来说,两边的空格可以轻松将它与小于号区分开:
x <- 3
x < -3
x<-3 # 这是赋值运算符还是小于号?
我们还可使用<<-
来对全局变量赋值。对此,在6.1节谈到环境和范围时会再作深入探讨。现在,只需把它看做创建了一个可在任意地方使用的变量:
x <<- exp(exp(1))
另一个变量赋值的方法是通过assign
函数赋值。这种情况不太常见,但在极个别情况下,使用函数语法来对变量赋值是很有用的。本地的(“标准的”)赋值函数需要两个参数:要赋值的变量名以及要赋予该变量的值。
assign("my_local_variable", 9 ^ 3 + 10 ^ 3)
全局赋值(如<<-
操作符一样)还需要加上一个参数:
assign("my_global_variable", 1 ^ 3 + 12 ^ 3, globalenv())
目前,不用担心globalenv
函数,第6章将作详细的解释。
警告
相比
<-
操作符,使用assign
函数会使代码可读性变差,因此须谨慎使用。有时,在一些涉及环境变量的高级程序设计中,它会使事情变得更简单。但如果你的代码中到处都是assign
函数,可能就出错了。还要注意的是,
assign
函数不会检查第一个参数是否是一个有效的变量名,它只是创建它。
请注意,当你对一个变量赋值时,不会马上看到值是多少。要看到变量包含的值,只需在命令提示符下键入其名称即可将其打印出来。
x
## [1] 1 2 3 4 5
注意
在某些系统中,例如从一个Linux终端运行R时,可能需要显式调用
print(x)
。
如果你想把赋值和打印语句都写在同一行,有两种选择。第一,把多个语句放在一行,中间用分号;
分开。第二,把赋值语句写在括号()
中。在下例中,rnorm
函数生成正态分布的随机数,而 rlnorm
函数则生成对数正态分布的随机数2:
2 由于数字是随机产生的,所以你自己尝试时可能会得到不同的值。
z <- rnorm(5); z
## [1] 1.8503 -0.5787 -1.4797 -0.1333 -0.2321
(zz <- rlnorm(5))
## [1] 1.0148 4.2476 0.3574 0.2421 0.3163