4 Basic: the ubiquitous x <- value
4.1 Create and replace
代码语句的最基本结构:x <- value
,表示将value
赋值给x
,其中<-
可以理解为执行了“赋值”(assignment)这一动作。这种基本结构只有两种使用场景:
-
x
是一个 name。在这种场景下,有两种用法,创建 object 或替换已有 object 。
# create object
a <- 1
从右往左读这行代码:
- 产生了一个没有名字的对象(object),即匿名对象(anonymous object),是一个长度为 1 的向量,value 为
1
; - 把这个 anonymous object 赋值给
a
,即用a
作为它的 name。
通过这样的方式就创建了一个 object,它的 name 为a
。以后如果想要和一个已经创建的 object 互动,就需要使用它的 name 来呼唤它,就好比养了一条宠物狗,要起个名字来互动一样。
比如想要把名叫a
的 object 的 value 翻倍:
a <- 1 # create object
a <- a*2 # replace the value of an existing object
# both the creating and the replacing actions are assigning
# a particular value to a specific name
为什么a <- 1
最好理解为“产生一个 anonymous object,其 value 为1
,然后将这个 anonymous object 赋给a
”,而不是“一个叫a
的 object,令它的 value 为1
”呢?
因为a <- 1
这行代码在 R 中是从右到左执行的,先产生一个 anonymous object 为1
,然后再给它赋给一个 name,变成一个存在于 Global Environment 里面有 name 有 value 的 object。换而言之,所有 anonymous object 都是不会存储在 Global Environment 里,即用即抛,不可以再和它互动。
-
x
是一个语句(一段代码),指代某个已经存在的 object 的一部分。这种场景下只有一种用法,就是替换。
a <- c(1, 2, 3) # create an object named "a"
a # print a to the console
#> [1] 1 2 3
a[2] <- 0.5 # replace the 2nd element of a with 0.5
a # print a to the console to check whether the replacement succeed
#> [1] 1.0 0.5 3.0
基本上绝大多数 R 代码归根结底都是x <- value
这种形式,或简单或复杂。
- 如果一行代码是
x <- value
的形式,那么执行该行该代码通常不会在 Console 输出结果。 - 如果一行 R 代码没有
<-
,而是只有 name ,那么 R 会到 Global Environment 里去寻找与 name 匹配的 object,然后将其 value 输出到 Console ; - 如果一行 R 代码没有
<-
,而是一个语句,相当于只有 value,生成了一个不会存储在 Global Environment 里的 anonymous object,执行这段代码时会将生成的 anonymous object 的 value 直接输出到 Console。
这也就意味着,如果看到某一行 R 代码中没有<-
,通常就应该预期在 Console 中看到输出。
例如:
a <- 1 # no output in console
a # print the value of a onto the console
1 # anonymous object, print its value onto the console
在 Console 会分别输出:
2 # the value of a
1 # the value of the anonymous object 1
注: R 中,#
表示注释,通常是用来解释代码的具体作用和功能。某一行代码中在#
后的所有部分, R 都不会执行。此外,#
只作用于所在行,不会跨行。
4.2 <-
vs =
在其他的计算机编程语言中,都是使用=
作为赋值符号的,但在 R 中用的是<-
。虽然用=
也可以,但并不建议这么做,因为不符合约定俗成的规范。
a <- 1
a = 1
4.2.1 When to use <-
and when to use =
- 赋值一律用
<-
; - function 的 argument 中使用
=
来分隔 argument 名和 argument 值。
a <- c(x1 = 1, x2 = 2, x3 = 3)
a
#> x1 x2 x3
#> 1 2 3
4.5 Basic: naming rules and recommendations
4.5.1 Rules
在 R 中,给 object 设定 name 的规则十分明确,只能由以下几类字符构成:
- 字母:
a-z
,A-z
; - 数字:
0-9
; -
.
; -
_
。
除此之外,还有两个不允许:
- 不允许由
_
,或0-9
,或.0-9
开始; - 不允许使用保留的单词,如
TRUE
,NULL
,if
和function
,全部保留的单词列表可以通过?Reserved
或help("Reserved")
查看。
任何 name 违背了上述两条规则时,都属于非法 name,执行时 R 会报错(error
)并中止当前执行的代码。
非法 name 示例:
#> Error: unexpected input in '_'
#> Error: unexpected symbol in '1a'
#> Error: unexpected assignment in 'if <-'
不过,如果记不住上述规则也不要紧,因为一旦使用了非法的 name,RStudio 就会有非常清晰的提示,所以无需记忆。
注意:R 中虽然可以使用中文作为 name,但并不建议这样做,可能会触发和解码有关的问题。
4.5.2 Recommendations
- 始终用小写字母;
- 必要时可使用下划线
_
区分不同部分(n_fruit
); - 变量名用名词(
n_fruit
),function
名用动词(order()
); - value 性质相同的 objects,命名时使用相同的前缀(
n_fruit
,n_class
,n_stu
,n_tea
);
4.6 Recap
- R 区分大小写;
- R 中所有的符号必须是英文半角符号;
-
x <- value
中当x
可以是 name,也可以是一个语句; -
x <- value
中当x
是一个 name 时,首次运行表示创建一个同名 object,后续运行表示替换该 object; -
x <- value
中当x
是一个语句时,该语句一般指是一个在 Global Environment 中已经存在的 object 的一部分,此时x <- value
表示替换该部分的值; -
<-
中间不能有空格; -
x <- value
结构的语句不会在 Console 有输出结果; - 一行代码只有
x
,没有<- value
的部分,执行时会在 Console 输出 Global Environment 中与x
匹配的 object 的 value,若只是一段可执行语句,即x <- value
结构中的value
部分,而没有x <-
部分,则输出value
本身的执行结果,生成一个 anonymous object; -
#
后面的所有内容都是注释,不会被执行。 - name 不允许由
_
,或0-9
,或.0-9
开始; - name 不可以是保留的单词,如
TRUE
,NULL
,if
和function
,等等; - name 里不建议使用中文。