《R语言编程艺术》——2.1 标量、向量、数组与矩阵

2.1 标量、向量、数组与矩阵

在许多编程语言中,向量与标量(即单个数值)不同。例如,考虑下面的C代码:

这段代码请求编译器给一个x的整型变量x分配空间,并给一个名为y的三元素整型数组(C语言中的术语,类似于R中的向量)分配内存空间。但在R中,数字实际上被当做一元向量,因为数据类型里没有标量。
R语言中变量类型称为模式(mode)。回顾第1章,同一向量中的所有元素必须是相同的模式,可以是整型、数值型(浮点数)、字符型(字符串)、逻辑型(布尔逻辑)、复数型等等。如果在程序中查看变量x的类型,可以调用函数typeof(x)进行查询。
不同于ALGOL家族的编程语言(比如C和Python)中的向量索引,R中向量索引从1开始。
2.1.1 添加或删除向量元素
与C语言类似,R中向量是连续存储的,因此不能插入或删除元素,而这跟Python语言中的数组不同。在R中,向量的大小在创建时已经确定,因此如果想要添加或删除元素,需要重新给向量赋值。
例如,把一个元素添加到一个四元向量的中间,如下代码所示:


在这里,我们创建了一个四元向量,赋值给x。为了在其第三和第四元素之间插入一个新的元素168,我们把x的前三个元素、168和x的第四个元素按顺序连起来,这样就创建出新的五元向量,而此时x并没发生变化。接下来再把这个新的向量赋值给x。
这一结果看似已经改变了x中存储的向量,但实际上创建了新的向量并把它存储到x。这样的区别看上去可能微乎其微,但它是有影响的。例如,在某些情况下,它可能限制R的快速执行的潜力,这一问题将在第14章讨论。
注意 对于C语言背景的读者来讲,x本质上是一个指针,重赋值是通过将x指向新向量的方式实现的。
2.1.2 获取向量长度
可以使用函数length()获得向量的长度。

在本例中,我们已经知道x的长度,所以实际上没有必要查询它。但在写一般函数的代码时,经常需要知道向量参数的长度。
例如,假设我们想要这样一个函数,用它判断其向量参数(假设存在这个值)中第一个1所在位置的索引值。下面是一种(不一定有效率的)代码的写法:

如果不要length()函数,则需要添加第二个参数在first1()上,命名为n,用于指定x的长度。
注意在该例中,将循环写成以下形式则无法运行:

这一方法的问题在于,它不能让我们获得所需元素的索引。因此,需要一个显式循环,这就需要计算x的长度。
该循环另一个问题是:要仔细进行编码,因为length(x)可能为0。下面看看在这种情况下,循环中的语句1:length(x)会发生什么:


在循环过程中,变量i先取值为1,然后取值0,但当x为空时,这显然不是我们想要的。
另一种较为保险的方法是,使用R 的高级函数seq(),我们将在2.4.4节中进行讨论。
2.1.3 作为向量的矩阵和数组
你将看到,数组和矩阵(在某种意义上说,甚至包括列表)实际上都是向量。只不过它们还有额外的类属性。例如矩阵有行数和列数。我们将在下一章详细讨论,但在本章我们没必要作区分,因为它们属于向量,在本章中讲到的一切内容,同样适用于它们。
考虑下面的例子:

这里2×2的矩阵m按列存储为一个四元向量,即(1,3,2,4)。现在对它加上(10,11,12,13),得到向量(11,14,14,17),但最终如例子中的结果,R记得我们是对矩阵进行操作,因此返回2×2的矩阵。

时间: 2024-08-29 12:15:20

《R语言编程艺术》——2.1 标量、向量、数组与矩阵的相关文章

《R语言编程艺术》——第3章 3.0 矩阵和数组

第3章 3.0 矩阵和数组 矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数.所以矩阵也和向量一样,有模式的概念,例如数值型和字符型.(但反过来,向量却不能看作是只有一列或一行的矩阵.)数组(array)是R里更一般的对象,矩阵是数组的一个特殊情形.数组可以是多维的.例如一个三维的数组可以包含行.列和层(layer),而一个矩阵只有行和列两个维度.本章主要讨论矩阵,本章最后一节会简述更高维的数组.R的强大之处就在于它丰富的矩阵运算.本章主要讲述这些运算,尤其注重类似于向量的取

《R语言编程艺术》——第2章 2.0 向量

第2章 2.0 向量 R语言最基本的数据类型是向量(vector).第1章已经给出了向量的一些例子,本章将详细介绍向量.首先考察向量与R语言的其他数据类型之间的关系.与C语言家族不同,R语言中,单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例.而另一方面,R语言中矩阵是向量的一种特例,这一点与C语言家族相同.接下来我们会用大量时间关注以下话题:循环补齐:在一定情况下自动延长向量.筛选:提取向量子集.向量化:对向量的每一个元素应用函数.这些运算是R编程的核心,在本书的其他部分也会经常提

《R语言编程艺术》——1.3 函数入门

1.3 函数入门 和大多数编程语言一样,R语言编程的核心是编写"函数".函数就是一组指令的集合,用来读取输入.执行计算.返回结果.我们先定义一个函数oddcount(),以此简单介绍函数的用法.这个函数的功能是计算整数向量中奇数的个数.一般情况下,我们会用文本编辑器编写好函数代码并保存在文件中,不过在这个简单粗略的例子中,我们只需要在R的交互模式中一行行输入代码.接下来,我们还会在几个测试案例中调用这个函数: 首先,我们告诉R想定义一个名为oddcount的函数,该函数有一个参数x.左

《R语言编程艺术》——导读

前言 R是一种用于数据处理和统计分析的脚本语言,它受到由AT&T实验室开发的统计语言S的启发,且基本上兼容于S语言.S语言的名称代表统计学(statistics),用来纪念AT&T开发的另一门以一个字母命名的编程语言,这就是著名的C语言.后来一家小公司买下了S,给它添加了图形用户界面并命名为S-Plus. 由于R是免费的,而且有更多的人贡献自己的代码,R语言变得比S和S-Plus更受欢迎.R有时亦称为GNU S,以反映它的开源属性.(GNU项目是开源软件的一个重要集合.) 为什么在统计工作

《R语言编程艺术》——1.4 R语言中一些重要的数据结构

1.4 R语言中一些重要的数据结构 R有多种数据结构.本节将简单介绍几种常用的数据结构,使读者在深入细节之前先对R语言有个大概的认识.这样,读者至少可以开始尝试一些很有意义的例子,即使这些例子背后更多的细节还需要过一段时间才能揭晓.1.4.1 向量,R语言中的战斗机 向量类型是R语言的核心.很难想象R语言代码或者R交互式会话可以一点都不涉及向量. 向量的元素必须属于某种"模式"(mode),或者说是数据类型.一个向量可以由三个字符串组成(字符模式),或者由三个整数元素组成(整数模式),

《R语言编程艺术》——2.9 向量化的ifelse()函数

2.9 向量化的ifelse()函数 除了多数语言中常见的if-then-else结构,R还有一个向量化的版本:ifelse()函数.它的形式如下: 其中b是一个布尔值向量,而u和v是向量. 该函数返回的值也是向量,如果b[i]为真,则返回值的第i个元素为u[i],如果b[i]为假,则返回值的第i个元素为v[i].这一概念相当抽象,因此我们看一个例子: 在这里,我们希望产生一个向量,这个向量在x中对应元素为偶数的位置取值是5,且在x中对应元素为奇数的位置取值12.因此,对应到形式参数b的实际参数

《R语言编程艺术》——3.4 增加或删除矩阵的行或列

3.4 增加或删除矩阵的行或列 严格来说,矩阵的长度和维度是固定的,因此不能增加或删除行或列.但是可以给矩阵重新赋值,这样可以得到和增加或删除一样的效果.3.4.1 改变矩阵的大小 回忆之前通过重新赋值改变向量大小的方法: 第一个例子里,x原来长度为5,通过拼接和重新赋值,将其长度变为6.事实上我们没有改变x的长度,而是生成一个新的向量,然后赋值给x. 注意 重新赋值的过程可能会在用户看不见的情况下进行,在14章我们将会介绍.例如,即使是x[2]<-12这种小操作事实上都是一个重新赋值的过程.

《R语言编程艺术》——2.6 向量化运算符

2.6 向量化运算符 假设我们希望对向量x中的每一个元素使用函数f().在很多情况下,我们可以简单地对x调用f()就能完成.这可以简化我们的代码,不仅如此,还能将代码运行效率显著提高到数百倍甚至更多.提高R代码执行速度的有效方法之一是向量化(vectorize),这意味着应用到向量上的函数实际上应用在其每一个元素上.2.6.1 向量输入,向量输出之前在本章你已经看到向量化运算的一些例子,即+和*运算符.另一个例子是>. 在这里,>函数分别运用在u[1] 和v[1],得到结果TRUE,然后是u[

《R语言编程艺术》——2.12 关于c()的更多内容

2.12 关于c()的更多内容 在本节中,我们将讨论与连接函数c()相关的一些其他内容,有时经常用到.如果传递到c()中的参数有不同的类型,则它们将被降级为同一类型,该类型最大限度地保留它们的共同特性,如下所示: 在第一个例子中,我们混合了整数型和字符型,R会选择把它们都转换为后者的类型.在第二个例子中,对于混合的表达式,R认为列表类型有较低的优先级.本书4.3节将对这一点作深入探讨.你可能不会写如此组合的代码,但你可能会遇到发生这种情况的代码,因此理解它的效果显得尤为重要.另一个需要注意的关键