第1篇 R语言基础
第1章 R简介
在本章中,我们简单介绍一下如何下载及安装R,如何启动和退出R,R是否区分大小写,以及如何为变量赋值。简言之,我们假定读者是R初学者,如金融专业的学生,对R一无所知。对于有一定R基础的学员,他们可以快速地浏览本章的内容,或直接跳到下一章。在本章中,我们将讨论为变量赋值的不同方法。在本章末尾,我们还讨论了将R应用到金融学上的优势及阻碍。实际上,最大的阻碍是金融相关专业的学生对学习计算机编程的内在恐惧。为此,在本书中,我们从最简单的方法入手,主要的目的是消除这些学生内在的恐惧,以增强他们的信心。我坚信在不远的将来,用一门计算机语言编程是每个金融系的学生所必备的能力之一。
1.1 下载和安装R
为安装R,我们有以下5个步骤。
第1步:访问R官网。
第2步:单击“Download R”。
第3步:选择一个靠近你的地址。
第4步:选择适当的软件(PC、Mac)。
第5步:单击“base”。
安装完毕后,R图标将出现在你的计算机桌面上,如图1-1所示。
图1-1 R图标
1.2 启动和退出R
若要启动R,请双击计算机桌面上R图标(见图1-1)。若要退出R,只需键入q()即可。
> q() # 第一种方法退出R
以上语句中,#标志是指注释句的开始。
# 这是一个注释行 # > 这左边的大于号是 R 的命令提示符
当退出时,R软件将询问你“是否保存工作空间映像”(见图1-2)。这实际上是问你是否“要保持所生成的变量及自编函数以供将来使用”。此阶段对新手而言,只需回答否(No),即选择图1-2中的第2个选项。
图1-2 询问用户是否保存工作空间映像
还有另一种方式可以退出R,即通过单击R软件菜单上的“File”,再单击“Exit”即可。在退出R且不想保存我们的一些已赋值的变量和自写函数时,可以使用q("no")的命令。
> q("no") # 退出R不保存生成的变量和函数 > q("yes") # 退出R保持生成的变量和函数
1.3 R的基本概念和功能
为变量赋值,可以使用<−、=或−>。
> x <-10 # 为 x 赋值10 > y = 20 # 为 y 赋值20 > 30 -> z # 为 z 赋值30 > word <-"Hello " # word 是一字符变量(字符串)
若要显示变量的值,只需键入它的变量名即可。
> x<-10 > x [1] 10
对R软件而言,我们不需要单独定义一个变量而可以直接为它赋值。
> fv <-100
R是区分大小写的,这意味着大写的和小写的代表不同的变量。
> x <-10 > X Error: object 'X' not found
以上的出错信息是指(大写的)'X'没能找到,原因是我们没有为其赋值。若要把几个R命令放在一起(同一行),可以使用分号(;)将它们隔开。
> fv <-10;pv <-100;n <-10;rate <-0.05
将一系列的值分配给一个向量,可以使用c()指令,这里c可理解为一列(英文为column)。
> x<-c(1,2.5,3.4,6.2)
如果向量内各个值之间的增量为1,起始值和终止值为和,我们可以使用:。
> y <-1:50
此时,意味着给y赋值为“1,2,3…,49,50”。
我们也可以颠倒其顺序。
> z <-10:1
此时,意味着给z赋值为“10,9,8…,2,1”。
请尝试使用以下代码和打印以查看其值。
> x <-1.5: 10
1.4 ls()函数和rm()函数
有时我们需要列出所有变量。此时,可以使用ls()函数。
> ls()
当不再需要一个变量时,我们可以从内存中删除它。
> rm(x) # 删除x变量
若要同时删除多个变量时,我们用逗号来分隔它们。
> rm(x,y,pv) # 同时删除 x、 y 及 pv
若要删除所有变量,我们有以下代码。
> rm(list=ls()) # 删除所有变量
还有另一方法来删除所有对象(变量),即[单击]R 菜单上的"Misc",然后选择 "Remove all objects…"。
若要在屏幕上打印字符变量(字符串),我们可以使用cat()或print()函数。记住要把句子用双引号或单引号包括起来。在下面的语句中,\n为换行符号。
> cat("Hello World!\n\n\n") Hello World! >
然而,对print()函数而言,另起一行的符号"\n"是无效的,见下例。
> print("Hello R\n") [1] "Hello R\n" >
我们也可以打印已赋值的变量。
> x<-'this is great' > print(x) [1] "this is great" >
1.5 换行符号(+)及R提示符
当一个命令占用多行时,我们会看到+符号。假设我们打算将1~10赋值给x。
> x <-1:10 # 将1,2,......到 10赋值给 x
出于某些原因,在完成整个命令之前,我们不小心按下了回车键。这时+符号将显示。换句话说,我们使用了两行来完成该语句。
> x <-1: # 我们不小心按下回车键 + 10 # 继续键入其余的命令 >
在编程时,往往会按错键,如双引号或单引号不匹配等。对初学者而言,尤其如此。很多时候,我们并不想弄清楚问题在哪里,因为找错可能比重新键入语句更为费时。我们只想回到R提示符并重新打入该命令。在这种情况下,按Esc键即可返回到R的提示符(<)。Esc键在键盘的左上角。
> x <-9"(999asdfklj + # 使用 Esc 重新回到 R 的提示符 >
1.6 寻求帮助
我们有几种方法来找到有关特定函数的信息。如果我们想查找均值函数(mean)的信息,我们可用“?mean”“help(mean)”或“example(mean)”。
>?mean
help(mean)的命令可达到和“?mean”命令相同的目的。
> help(mean)
若要获取一个特定函数的有关实例,我们可使用example()函数。
> example(mean)
为了寻求帮助,我们也可以使用R菜单上的Help功能,即单击“Help”,然后选择“FAQ on R”。
FAQ的英文全拼为Frequently Asked Questions,意思为“常问的问题”。图1-3显示了单击R菜单上的“Help”后所显示的所有条目。
图1-3 Help菜单
当不确定函数的拼法时,可以使用apropos()函数。
> apropos("sd") [1] ".F_dqrrsd" ".isMethodsDispatchOn" [3] "assignClassDef" "completeClassDefinition" [5] "getClassDef" "isClassDef" [7] "isdebugged" "makePrototypeFromClassDef" [9] "sd" "SSD" [11] "superClassDepth" "tsdiag" [13] "TukeyHSD" "UScitiesD" >
若想我们的关键字(字母)在一词的开始时出现,我们使用“^关键字”,如apropos("^col")。若希望其在词尾出现用“关键字$”,如apropos("col$")。
> apropos("col$") [1] "col" "max.col" "ncol" "NCOL" > apropos("^col") [1] "col" "col2rgb" "colMeans" [4] "colnames" "colnames<-" "colorConverter" [7] "colorRamp" "colorRampPalette" "colors" [10] "colorspaces" "colours" "colSums" > apropos("col$") [1] "col" "max.col" "ncol" "NCOL" >
此外,为显示长度为3的所有函数,我们有以下指令:apropos("^.{3}$")。
> apropos("^.{3}$") [1] "$<-" "%*%" "%/%" "%o%" "%x%" ".gt" ":::" "@<-" "[<-" "<<-" [11] "abs" "acf" "AIC" "all" "any" "aov" "Arg" "ave" "BIC" "bmp" [21] "BOD" "box" "bxp" "cat" "ccf" "co2" "CO2" "col" "cor" "cos" [31] "cov" "cut" "det" "dim" "dir" "end" "exp" "fft" "fix" "for" [41] "get" "glm" "hat" "hcl" "hsv" "IQR" "lag" "lcm" "log" "mad" [51] "Map" "max" "min" "Mod" "new" "nlm" "nls" "npk" "Ops" "par" [61] "pdf" "pie" "png" "ppr" "raw" "rep" "rev" "rgb" "rle" "row" [71] "rug" "seq" "sin" "SSD" "stl" "str" "sub" "sum" "svd" "svg" [81] "tan" "tar" "try" "tsp" "unz" "url" "var" "x11" "X11" "xor" [91] "zip" >
在此阶段对于新手而言,无须理解("^.{3}$")的确切含义。我们会在以后章节中对该语句作详细的讲解。
1.7 使用R作为一个普通计算器
R可以用作一个简单的计算器。原因是通过R,我们可以调用许多内存函数。例如,mean()是求平均值的函数。
> x <-1:50 > mean(x) [1] 25.5
大家可以尝试其他的函数:max()、min()、median()、sd()和var()等。
> x <-1:50 > max(x) [1] 50 > min(x) [1] 1 > median(x) [1] 25.5 > sd(x) [1] 14.57738
1.8 找回以前的命令
当我们要重新显示已执行的命令并修改它时,可以按键盘上的向上键。
> x <-1:5 > x <-1:500
发出一组命令行后,我们可以反复使用向上键和向下键来“召回”并纠正“老”的命令。这对检查和修改我们的代码非常方便,原因是你总能找回前一命令并对其做少许的修改。
1.9 比较ls()函数和dir()函数
我们不应混淆dir()和ls()的区别。dir()可以列出我们当前的工作目录或指定目录(如使用绝对路径法)下的文件,如程序、输入数据文件、输出数据文件、输入数据集和输出数据集等。ls()可以列出在我们当前的工作空间所包含的R对象(objects)。
> ls() # 列出当前工作空间包含的所有对象
R对象包括我们定义的变量、数据表、数据框、向量、数组和函数。在此阶段,如果你不了解数据表、数据框、向量和数组等的定义,不必担心。因为在后面的章节中,我们将仔细讨论这些概念。
> ls(pat='test') # 显示包含 'text' 的所有对象
另一种方式来显示所有的目标是使用objects()函数
> objects() # 第二种方式来显示所有的对象
我们用rm()函数从内存中删除不必要的变量、函数及数据。
> rm(x) # 删除 x > rm(x,y) # 删除 x 和 y
有几种方法可以删除所有对象,如下所示。
# rm(list=ls((all=TRUE))) # 删除所有对象 (方法 1) # rm(list=ls()) # 简单一点的方法来删除所有对象
通过R软件的菜单,也可以删除所有对象,即单击R菜单上的“Misc”,然后选择“Remove all objects…”
另外,如果想要从我们当前的工作目录或指定目录下删除一个文件,可以使用file.remove()函数。
> file.remove('test.R') # 相对路径法 > file.remove ('datas/test2.R') # 绝对路径法
1.10 R的精度
在大多数情况下,大多数研究人员并不在意R软件的精度。然而,知道如何找到它对将来可能有益,因为我们可能会遇到有关的问题。
> .Machine $ double.eps [1] 2.220446e-16
1.11 列出当前工作目录下的文件
dir()函数用来列出所有的程序、数据集和其他存在于当前的工作目录下的文件。
> dir() # 显示当前工作目录中下的所有程序等
当我们想要显示某一类文件时,可以使用以下代码。
> dir(pattern="ratio") # 显示文件名中含有"ratio" 的文件
如果我们打算检查非当前工作目录下的文件,则需添加path="our_path_here",这就是所谓的绝对途径法。
> dir(path="datas/",pattern="t.R")
1.12 改变当前的工作目录
为显示当前的工作目录,我们使用getwd()函数。
> getwd() [1] "C:/Users/yyan/Documents"
在做项目时,我们往往会生成专门的文件目录(档案),以包含所有的数据、程序和其他相关的文件。在启动R后,我们通常希望那个与项目相关联的目录成为当前工作目录。第1种改变当前工作目录的方式是使用R菜单栏,即通过单击“File”,然后选择“Change dir…”。
第2种方式是使用setwd()函数来改变当前的工作目录。
> setwd("datas") # 改变当前的工作目录 > getwd() # 查看当前的工作目录 [1]"datas"
在上述语句中,getwd()用于显示当前目录。上面我们用该函数来确认已经改变了的工作目录。
1.13 改变启动R时的工作目录
如我们在下面3个月将用R完成一个项目。在启动R时,我们希望R直接将有关的目录设置为当前工作目录。为此,我们将按下面的步骤设置。第1步,在R软件的图标上单击鼠标右键;第2步,选择“属性”;第3步,在弹出窗口的“起始位置”选项处,填入我们指定的工作目录。
例如,如果你打算在启动R时,直接将c:\test_R\作为工作目录,那就可以按照上面的方法去做。
1.14 R在金融建模中的优势与障碍
本书的主要目的是将R应用在金融学上面将R应用在金融领域方面的优势,这里就不再赘述了。我们只是将金融学的学生学习R的优点用表给出。表1.1列出在财务入门课程中引入R软件的优势。
表1.1 R软件在金融学上使用的优势
灵活性意味着,用户可以选取他们自己最喜欢的函数。例如,我们知道可以写很简单的一行的R程序来计算未来值的现值。有关公式为:
在公式(1-1)中,是现值,是未来值,是资本的期贴现率(折现率),是周期数。
pv_f<-function(fv,r,n) fv/(1+r)^n
在后面我们将仔细讲解该函数的构造。对上述的pv_f的函数而言,用户可以为其重命名为pv_function或my_PV_function等。如果你仍想保持原有的函数,可以添加另一个函数。请参阅下面的示例。
> my_PV_function(fv,r,n) pv_f(fv,r,n)
在上面的程序中,my_PF_function()的功能和我们原有的pv_f()函数一样。当一名本科学生申请硕士学位时,R的知识会给她/他许多优势。使用R的知识和技能会为想去华尔街工作的毕业生增加一定的分量。因为很多金融机构都是使用S+。S+可以认为是R的表姐妹。表1.2给出了R在金融学上使用的障碍。
表1.2 R在金融学上使用的障碍
1.15 练习题
(1)使用R软件的优点和阻碍有哪些?
(2)就R而言,如何将一个值分配给一个新的变量?
(3)R区分大小写吗?如何获取有关特定函数的帮助?
(4)使用R时,如何添加注释?R编译器编译它吗?
(5)空格在R中有无作用?
(6)如何下载与R相关的手册?
(7)我们需要先定义一个变量,例如整数或字符,然后再使用它吗?
(8)函数ls()和rm()之间的区别有哪些?
(9)为某个向量赋值,起始值为−2.45,终止值为10,相同的增值为2.25。共有多少值?
(10)x的输入值范围1~100和202~300。
(11)反转上题中的输入值。
(12)如何列出所有文件?
(13)函数ls()和dir()有何区别?
(14)如何发现有关sd()函数的有用信息?
(15)如何发现所有5个字母的内在函数?
(16)对非计算机系的学生而言,如何克服学习编程的恐惧?
(17)生成一系列数字:1、2、3、5、8及10并计算他们的均值及方差。
(18)R中的零是如何定义的?