第8章 R的内部机制
在前面的章节中,我们已经学习了R语言的基础功能,并且了解了如何运用向量、矩阵、列表和数据框表示不同形式的数据,以及用内置函数解决简单的问题。但是仅仅了解这些功能并不能解决所有问题。现实中的数据分析通常需要对数据进行仔细的转换和聚合,而这些操作则需要各种各样内置的或是由扩展包提供的函数。
为了避免对一些意外结果感到混乱和困惑,更好地理解和运用这些函数,需要对 R 中函数的运行方式有一个基本但具体的理解。在本章中,我们将会学习以下内容:
- 惰性求值(Lazy evaluation)
- 复制—修改机制(Copy-on-modify mechanism)
- 词法作用域(Lexical scoping)
- 环境(Environments)
如果理解了这些概念及其在代码中的作用,就能够轻松地看明白大部分R代码,同时也会提高查找漏洞和编写合适函数的效率。
8.1 惰性求值
如果能够理解 R 函数的运行机制,那么对 R 的运行机制就能够掌握十之八九。通过前几章的学习,我们掌握了一些最常用的基本函数的用法,但是可能对其内部机制仍有疑惑。比如创建如下的函数:
test0 <- function(x, y) {
if (x > 0) x else y
}
这个函数有点特殊,看似只有当 x
不大于0时才需要 y
。如果只把一个正数赋值给 x
而忽略 y
,这个函数会因为没有为所有定义的参数赋值而报错么?我们调用这个函数运行一下看看:
test0(1)
## [1] 1
即使没有对 y
赋值,函数仍能够运行。看来在调用函数时不必对所有参数进行赋值,只对必需的参数赋值即可。如果给 x
赋一个负数,函数便需要参数 y
才能运行:
test0(-1) ## Error in test0(-1): ...
Get R编程学习指南 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.