本视频总结自Youtuber:吴明昊老师的R语言教学视频:

Introduction to R Programming. Lecture 1.——Lecture 6.

本系列笔记中的每一个所对应的是吴老师的一节课,所以一共有6个笔记。

大家如果对我的总结有疑问可以直接去看吴老师的视频。

文章中的所有的gif演示是本人自己截的gif。


-文章中有错误或表述不当之处还请各位大佬指出,谢谢!

PS:请各位大佬在指出错误的时候说明为什么是错的(希望在指正的时候语言能够做到逻辑清晰),并指出具体位置,我好加以改正,谢谢!


首先,我们要来解决上次课程中的未解决的问题,即list。

Lists are the most complex of the R data types. Basically, a list is an ordered collection of objects (components). A list allows you to gather a variety of (possibly unrelated) objects under one name.




r语言列表延长_if语句


gif 1.

gif 1向我们演示的是如何返回一个list。所用使用的代码很简单:
<list's name> = list(..)
list 是R语言中最为复杂的数据结构,在list里面可以存放任何数据类型。
比如在gif 1中的ml list中,我就存放了一个data frame和一个matrix。
想在list里面存什么类型的数据,就在list(..)后面的括号里写该数据类型所对应的名称就可以了。
而且list里面所存储的数据是没有数量限制的。


r语言列表延长_r语言列表延长_02

gif 2.


gif 2向我们演示的是在一个list里面存放已经提前创建好的一个matrix,array和patientdata。
list(..)括号里面输入参数的顺序不同会导致输出的顺序不同。


r语言列表延长_while循环_03

gif 3.

gif 3向我们演示的是对list的一些基本操作。由于作为例子,所以我们处理的对象也比较简单,就是在gif 1中所创建的ml。我们来看看gif 13中的代码和各参数都有何意义:
首先[[..]]中括起来的是list中的第..个元素。所以:
ml[[a]]:返回list ml中的第a个元素的所有内容。若a=1,则在gif 3中的ml的第一个元素是patientdata,即ml[[1]]返回的就是整个data frame patientdata。
下面,我们先来介绍的是如何对ml中的第二个元素,即matrix x进行操作。
ml[[2]][2]:返回ml中的matrix x的第二行的第一个数字。
ml[[2]][1:2]:返回matrix x的第一列的第一行的第一个数字和第一列的第二行的第一个数字。
ml[[2]][1:2,3]:返回ml中的matrix x的第三列的第一行的第一个数字和第三列的第二行的第一个数字。
ml[[2]][1:2,]:返回ml中的matrix x中的第一行和第二行的全部元素。
下面我们再来说一下gif 3中没有的一些操作,是我通过实践进行整理的。
ml[[2]][,1:2]:返回ml中的matrix x中的第一列和第二列的全部元素。
这里我们需要注意的是代码:
ml[[2]][1:2]
ml[[2]][,1:2]:
ml[[2]][1:2,]:
之间的区别。下面要介绍的对ml中的data frame patientdata 的操作与对matrix x的所返回的结果会有不同。
ml[[1]][1:2] 和ml[[1]][,1:2]:这两个代码返回的都是ml中的data frame patientdata中的前两列的元素。
在继续之前我们先来思考一下为何在后面的单方括号内容相同的情况下matrix和data frame所返回的结果是不同的?
在上一讲中我们知道,matrix是由单个元素所组成的结构,而data frame是由单个向量所组成的结构,也就是说两者的“元结构”是不同的,而单方括号中的内容所返回的都是各个数据结构的元结构,所以,代码ml[[2]][1:2]返回的是matrix中的两个数字,而代码ml[[1]][1:2]返回的确实data frame中的两个向量。而且在之前的学习中我们应该要领会的到式[]中如果不加","则默认的是输出列。所以,如果要输出matrix x 的前两列需要这样的代码:ml[[2]][,1:2]。而对于data frame patientdata来说,代码ml[[1]][1:2] 和ml[[1]][,1:2]所输出的结果是相同的。
对于行的操作,两者在相同操作下输出的结果是“相同”的。
如图gif 4所示。


r语言列表延长_if语句_04

gif 4.





>:大于。
>=:大于等于。
<:小于。
<=:小于等于。
==:等于。
!=:不等于。
|:逻辑或。
&:逻辑与。
=:赋值。


Looping constructs repetitively execute a statement or series of statement until a condition is not true. These include the 
  
    and  
  
    structure.


r语言列表延长_if语句_05

illustration 5.

illustration 5是一个for loop的流程图。其中
A:初始条件。
B:逻辑语句。
D:其他语句。
C:变量增量。
首先从初始条件A开始计入循环,然后经过第一次从A到C的执行之后回到B,判断经过变量增加之后的值是否满足逻辑语句B,若满足(TRUE),则再次进入循环;若不满足(FALSE),则跳出循环。


r语言列表延长_R循环有两个_06

illustration 6.

illustration 6是一个while loop的流程图。其中:
A:逻辑语句。
B:其他语句。
首先先从A到B执行一次,执行完毕后回到A判断变化后的增量是否仍满足A(TRUE),若满足,则再次执行循环;若不满足(FALSE),则跳出循环。


r语言列表延长_if语句_07

gif 7.

gif 7向我们演示的是两个最简单的for loop和while loop。我们来介绍一下两者的语法并分别分析一下过程。
for(<variable> in ..){..}
这个for loop用语言进行描述就是当<variable>在in后面的“内容”中的时候,继续执行循环,否则跳出循环。也就是说<variable>是否在in后面的“内容”中就相当于是一个逻辑语句。在(TRUE),不在(FALSE)。
这个for loop所运行的结果很简单:将1到10的所有数字打印出来。
下面我们再来分析一下while loop。
<initialization>
while(test_experssion){..}
首先,我们将一个循环变量赋初值(在gif 7中,while中的循环变量是j,j的初值是1),先验证循环变量是否满足test_experssion,如果满足,则进入while循环并执行一次while循环里面的内容,如果不满足,则直接跳过while循环。一般而言,在while的循环体中,会存在一个与循环变量有关的语句,用于改变循环变量的值。循环变量的值被改变之后会再次验证test_experssion,若满足,则再次执行while循环体里面的内容,直到循环变量的值不满足test_experssion,跳出while循环。
如gif 7中的while loop所示,这个while loop执行的也是将1到10这10个数字打印出来。


In conditional execution, a statement or statements are only executed if a specified condition is met. The constructs include 
  
    ,  
  
    and  
  
    .


r语言列表延长_r语言列表延长_08

illustration 8.

illustration 8是if-else语句的流程图,下面我们来解释一个这个流程图:
A:逻辑语句。
B:if后面的语句。
C:else后面的语句。
若A的值为TRUE,则执行if后面的语句(即B);若A的值为FALSE则执行else后面的语句(即C)
如果仅为if语句,则不存在C,也就是说在单独的if语句中,若A的值为TRUE,则执行if后面的语句,若A的值为FALSE则直接跳过if语句。
if语句和if-else语句的格式分别为:
if(<logical statement>){..}
if(<logical statement>){..}
else{..}
需要注意的的是,R语言不支持if-else if语句。
gif 9向我们演示的是两个简单的例子。


r语言列表延长_R循环有两个_09

gif 9.

下面我们要介绍的是switch语句。
R语言中虽然不支持if-else if语句但是其支持一种类似于if-else if语句的语句,即switch语句。
我们通过gif 10中的例子来解释一下switch语句。


r语言列表延长_r语言列表延长_10

gif 10.

gif 10是一个比较简单的switch语句,我们来解释一下它的运行过程。
首先我们创建了一个向量mv,在mv中存入了A到F这6个字符。然后,我们使用了一个for循环,这个循环意在打印出这个向量mv中的某些元素所对应的值,而switch的作用就是匹配存在于矢量mv中的元素,然后将匹配到的元素的对应的值打印出来。
switch里面所匹配到mv中的元素是"A","C","E",从而打印出的就是给A,C,E对应的值。
检查是否匹配就是一个逻辑语句,是就是TRUE,不是就是FALSE。多次检查是否匹配其实就是就是进行多次if语句,这就十分类似于if-else if语句了。




One of the greatest strength of R is ability to add function, many of the function in R are functions of the existing functions.

在R中,我们可以写一些自己的函数。下面是声明一个函数的标准格式:
<function's name> = function(paramenters){..}
其中,function's name自己进行命名就好,一般使用小写字母进行命名。
function()括号里面的参数个数没有限制。
一般在函数体(花括号)中会存在一个return()语句,但这个return()语句是根据情况来决定是否要写。
return()语句中的小括号是必须的。
在gif 11中我们来写一个简单的函数。


r语言列表延长_if语句_11

gif 11.

在gif 11中我们定义了一个函数mf,其中有四个参数:x,a,b,c,之间用逗号隔开。
函数体也很简单,就是返回了一个函数:
a*sin(x)^2-b*x+c
之后我们可以使用curve()函数画出这个函数的图像。
curve()中的第一个参数是我们所定义的函数,但是我们只给参数a,b,c赋了值,而保留而参数x。
xlim = c(..)是给参数x设定了一个范围,即


所画出的图像RStudio中的右下角所示的图像。
我们不妨在画一个函数玩玩:


r语言列表延长_r语言 新增一列数字类型_12

gif 12.

时候的图像。