第1章 简介 1
1.1 本书的目标读者 2
1.2 通过本书你可以学到什么 2
1.3 元技术 3
1.4 推荐阅读 3
1.5 获取帮助 4
1.6 致谢 4
1.7 约定 5
1.8 声明 5
第一部分 基础知识 8
第2章 数据结构 8
2.1 向量 9
2.1.1 原子向量 9
2.1.2 列表 11
2.1.3 练习 12
2.2 属性 12
2.2.1 因子 13
2.2.2 练习 15
2.3 矩阵和数组 15
2.4 数据框 17
2.4.1 数据框构建 17
2.4.2 类型判断与强制转换 18
2.4.3 合并数据框 18
2.4.4 特殊列 19
2.4.5 练习 19
2.5 答案 19
第3章 子集选取 21
3.1 数据类型 22
3.1.1 原子向量 22
3.1.2 列表 23
3.1.3 矩阵和数组 23
3.1.4 数据框 24
3.1.5 S3对象 25
3.1.6 S4对象 25
3.1.7 练习 25
3.2 子集选取运算符 26
3.2.1 简化与保留 26
3.2.2 $ 27
3.2.3 缺失/超出索引边界(越界引用) 28
3.2.4 练习 28
3.3 子集选取与赋值 29
3.4 应用 30
3.4.1 查询表(字符子集选取) 30
3.4.2 人工比对与合并(整数子集选取) 30
3.4.3 随机样本/自助法(整数子集选取) 31
3.4.4 排序(整数子集选取) 31
3.4.5 展开重复记录(整数子集选取) 32
3.4.6 剔除数据框中某些列(字符子集选取) 33
3.4.7 根据条件选取行(逻辑子集选取) 33
3.4.8 布尔代数与集合(逻辑和整数子集选取) 34
3.4.9 练习 35
3.5 答案 35
第4章 常用函数与数据结构 36
4.1 基础函数 36
4.2 常见数据结构 37
4.3 统计函数 38
4.4 使用R 39
4.5 I/O函数 39
第5章 R编程风格指南 40
5.1 符号和名字 40
5.1.1 文件名 40
5.1.2 对象名 40
5.2 语法 41
5.2.1 空格 41
5.2.2 大括号 42
5.2.3 行的长度 42
5.2.4 缩进 42
5.2.5 赋值 43
5.3 结构 43
第6章 函数 44
6.1 函数组成部分 45
6.1.1 原函数 45
6.1.2 练习 46
6.2 词法作用域 46
6.2.1 名字屏蔽 47
6.2.2 函数与变量 48
6.2.3 重新开始 48
6.2.4 动态查找 49
6.2.5 练习 50
6.3 每个运算都是一次函数调用 50
6.4 函数参数 51
6.4.1 函数调用 52
6.4.2 使用参数列表来调用函数 53
6.4.3 默认参数和缺失参数 53
6.4.4 惰性求值 54
6.4.5 ...参数 56
6.4.6 练习 57
6.5 特殊调用 57
6.5.1 中缀函数 57
6.5.2 替换函数 58
6.5.3 练习 59
6.6 返回值 59
6.6.1 退出时 61
6.6.2 练习 62
6.7 答案 62
第7章 面向对象编程指南 64
7.1 基础类型 65
7.2 S3 66
7.2.1 认识对象、泛型函数和方法 66
7.2.2 定义类和创建对象 67
7.2.3 创建新方法和泛型函数 69
7.2.4 方法分派 69
7.2.5 练习 71
7.3 S4 71
7.3.1 识别对象、泛型函数和方法 72
7.3.2 定义类并创建对象 73
7.3.3 创建新方法和泛型函数 74
7.3.4 方法分派 74
7.3.5 练习 75
7.4 RC 75
7.4.1 定义类和创建对象 75
7.4.2 识别类和方法 77
7.4.3 方法分派 77
7.4.4 练习 77
7.5 选择一个系统 77
7.6 答案 78
第8章 环境 79
8.1 环境基础 79
8.2 环境递归 83
8.3 函数环境 85
8.3.1 封闭环境 85
8.3.2 绑定环境 86
8.3.3 执行环境 87
8.3.4 调用环境 88
8.3.5 练习 90
8.4 绑定名字和数值 90
8.5 显式环境 92
8.5.1 避免复制 93
8.5.2 软件包状态 93
8.5.3 模拟hashmap 93
8.6 答案 94
第9章 调试、条件处理和防御性编程 95
9.1 调试技巧 96
9.2 调试工具 97
9.2.1 确定调用顺序 98
9.2.2 查看错误 99
9.2.3 查看任意代码 100
9.2.4 调用栈:traceback()、where和recover() 100
9.2.5 其他类型的故障 101
9.3 条件处理 102
9.3.1 使用try来忽略错误 102
9.3.2 使用tryCatch()处理条件 103
9.3.3 withCallingHandlers() 105
9.3.4 自定义信号类 106
9.3.5 练习 107
9.4 防御性编程 107
9.5 答案 109
第二部分 函数式编程 112
第10章 函数式编程 112
10.1 动机 112
10.2 匿名函数 116
10.3 闭包 117
10.3.1 函数工厂 119
10.3.2 可变状态 119
10.3.3 练习 120
10.4 函数列表 120
10.4.1 将函数列表移到全局环境中 122
10.4.2 练习 123
10.5 案例研究:数值积分 124
第11章 泛函 127
11.1 第一个泛函:lapply() 128
11.1.1 循环模式 129
11.1.2 练习 130
11.2 for循环泛函:lapply()的相似函数 131
11.2.1 向量输出:sapply和vapply 131
11.2.2 多重输入:Map(和mapply) 133
11.2.3 滚动计算 134
11.2.4 并行化 135
11.2.5 练习 136
11.3 操作矩阵和数据框 137
11.3.1 矩阵和数组运算 137
11.3.2 组应用 138
11.3.3 plyr添加包 139
11.3.4 练习 140
11.4 列表操作 140
11.4.1 Reduce() 140
11.4.2 判断泛函 141
11.4.3 练习 141
11.5 数学泛函 142
11.6 应该保留的循环 143
11.6.1 原位修改 143
11.6.2 递归关系 144
11.6.3 while循环 144
11.7 创建一个函数系列 145
第12章 函数运算符 149
12.1 行为函数运算符 150
12.1.1 缓存 152
12.1.2 捕获函数调用 153
12.1.3 惰性 155
12.1.4 练习 155
12.2 输出函数运算符 156
12.2.1 简单修饰 156
12.2.2 改变函数的输出 157
12.2.3 练习 158
12.3 输入函数运算符 159
12.3.1 预填充函数参数:局部函数应用 159
12.3.2 改变输入类型 159
12.3.3 练习 160
12.4 组合函数运算符 161
12.4.1 函数复合 161
12.4.2 逻辑判断和布尔代数 163
12.4.3 练习 163
第三部分 语言计算 166
第13章 非标准计算 166
13.1 表达式获取 167
13.2 在子集中进行非标准计算 168
13.3 作用域问题 171
13.4 从其他函数调用 173
13.5 替换 175
13.5.1 为替换提供应急方案 177
13.5.2 捕获未计算的表达式 177
13.5.3 练习 178
13.6 非标准计算的缺点 178
第14章 表达式 180
14.1 表达式的结构 180
14.2 名字 183
14.3 调用 184
14.3.1 修改调用 185
14.3.2 根据调用的元素来创建调用 186
14.3.3 练习 186
14.4 捕获当前调用 187
14.5 成对列表 189
14.6 解析与逆解析 191
14.7 使用递归函数遍历抽象语法树 192
14.7.1 寻找F和T 193
14.7.2 寻找通过赋值创建的所有变量 194
14.7.3 修改调用树 197
14.7.4 练习 198
第15章 领域特定语言 200
15.1 HTML 200
15.1.1 目标 201
15.1.2 转义 202
15.1.3 基本标签函数 203
15.1.4 标签函数 204
15.1.5 处理所有标签 205
15.1.6 练习 206
15.2 LaTeX 206
15.2.1 LaTeX数学 206
15.2.2 目标 207
15.2.3 to_math 207
15.2.4 已知符号 207
15.2.5 未知符号 208
15.2.6 已知函数 209
15.2.7 未知函数 210
15.2.8 练习 211
第四部分 性能 214
第16章 性能 214
16.1 R为什么速度慢 214
16.2 微测试 215
16.3 语言性能 216
16.3.1 极端动态性 216
16.3.2 可变环境下的名字搜索 218
16.3.3 惰性求值开销 219
16.3.4 练习 219
16.4 实现的性能 220
16.4.1 从数据框提取单一值 220
16.4.2 ifelse()、pmin()和pmax() 220
16.4.3 练习 222
16.5 其他的R实现 222
第17章 代码优化 225
17.1 性能测试 226
17.2 改进性能 229
17.3 组织代码 229
17.4 有人已经解决了这个问题吗 230
17.5 尽可能少做 231
17.6 向量化 236
17.7 避免复制 237
17.8 字节码编译 238
17.9 案例研究:t检验 238
17.10 并行化 240
17.11 其他技术 241
第18章 内存 243
18.1 对象大小 243
18.2 内存使用与垃圾回收 246
18.3 使用lineprof对内存进行性能分析 248
18.4 原地修改 250
18.4.1 循环 252
18.4.2 练习 253
第19章 使用Rcpp编写高性能函数 254
19.1 开始使用C++ 255
19.1.1 没有输入,标量输出 256
19.1.2 标量输入,标量输出 256
19.1.3 向量输入,标量输出 257
19.1.4 向量输入,向量输出 258
19.1.5 矩阵输入,向量输出 258
19.1.6 使用sourceCpp 259
19.1.7 练习 260
19.2 属性和其他类 261
19.2.1 列表和数据框 262
19.2.2 函数 262
19.2.3 其他类型 263
19.3 缺失值 263
19.3.1 标量 263
19.3.2 字符串 265
19.3.3 布尔型 265
19.3.4 向量 265
19.3.5 练习 266
19.4 Rcpp语法糖 266
19.4.1 算术和逻辑运算符 266
19.4.2 逻辑总结函数 267
19.4.3 向量视图 267
19.4.4 其他有用的函数 267
19.5 STL 268
19.5.1 使用迭代器 268
19.5.2 算法 269
19.5.3 数据结构 270
19.5.4 向量 270
19.5.5 集合 271
19.5.6 图 272
19.5.7 练习 272
19.6 案例研究 272
19.6.1 Gibbs采样器 273
19.6.2 R向量化与C++向量化 274
19.7 在添加包中应用Rcpp 275
19.8 更多学习资源 276
19.9 致谢 277
第20章 R的C接口 278
20.1 从R中调用C函数 279
20.2 C数据结构 280
20.3 创建和修改向量 281
20.3.1 创建向量和垃圾回收 281
20.3.2 缺失值和非有限值 282
20.3.3 访问向量数据 283
20.3.4 字符向量和列表 284
20.3.5 修改输入 284
20.3.6 强制转换标量 285
20.3.7 长向量 285
20.4 成对列表 286
20.5 输入验证 287
20.6 寻找一个函数的C源代码 289
索引 292