官术网_书友最值得收藏!

第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和小寫的x代表不同的變量。

> 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,起始值和終止值為n_1n_2,我們可以使用n_1:n_2

> y <-1:50

此時,意味著給y賦值為“1,2,3…,49,50”。

我們也可以顛倒其順序。

> z <-10:1

此時,意味著給z賦值為“10,9,8…,2,1”。

請嘗試使用以下代碼和打印x以查看其值。

> 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是現值,FV是未來值,R是資本的期貼現率(折現率),n是周期數。

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中的零是如何定義的?

主站蜘蛛池模板: 肥乡县| 仪陇县| 石台县| 安庆市| 赤水市| 容城县| 拉孜县| 攀枝花市| 五华县| 遂宁市| 临沧市| 平远县| 新沂市| 兴宁市| 荆州市| 资溪县| 缙云县| 江都市| 长海县| 康平县| 文化| 鹿泉市| 永兴县| 阳原县| 宁武县| 灵丘县| 镇康县| 东台市| 东港市| 钦州市| 武清区| 永川市| 郎溪县| 花莲县| 通许县| 峨边| 莱西市| 贺州市| 二连浩特市| 永和县| 康平县|