一門(mén)新的語(yǔ)言學(xué)習(xí)一般是從輸出 "Hello, World!" 程序開(kāi)始,R 語(yǔ)言的 "Hello, World!" 程序代碼如下:
myString <- "Hello, World!" print ( myString )
以上示例將字符串 "Hello, World!" 賦值給 myString 變量,然后使用 print() 函數(shù)輸出。
注意:R 語(yǔ)言賦值使用的是左箭頭 <- 符號(hào),不過(guò)一些新版本也支持等號(hào) =。
R 語(yǔ)言的有效的變量名稱(chēng)由字母,數(shù)字以及點(diǎn)號(hào) . 或下劃線 _ 組成。
變量名稱(chēng)以字母或點(diǎn)開(kāi)頭。
變量名 | 是否正確 | 原因 |
---|---|---|
var_name2. | 正確 | 字符開(kāi)頭,并由字母、數(shù)字、下劃線和點(diǎn)號(hào)組成 |
var_name% | 錯(cuò)誤 | % 是非法字符 |
2var_name | 錯(cuò)誤 | 不能數(shù)字開(kāi)頭 |
.var_name, var.name | 正確 | 可以 . 號(hào)開(kāi)頭,但是要注意 . 號(hào)開(kāi)頭后面不能跟著數(shù)字 |
.2var_name | 錯(cuò)誤 | . 號(hào)開(kāi)頭后面不能跟著數(shù)字 |
_var_name | 錯(cuò)誤 | 不能以下劃線 _ 開(kāi)頭 |
最新版本的 R 語(yǔ)言的賦值可以使用左箭頭 <-、等號(hào) = 、右箭頭 -> 賦值:
# 使用等號(hào) = 號(hào)賦值 > var.1 = c(0,1,2,3) > print(var.1) [1] 0 1 2 3 # 使用左箭頭 <-賦值 > var.2 <- c("learn","R") > print(var.2) [1] "learn" "R" # 使用右箭頭 <- 賦值 > c(TRUE,1) -> var.3 > print(var.3) [1] 1 1
查看已定義的變量可以使用 ls() 函數(shù):
> print(ls()) [1] "var.1" "var.2" "var.3"
刪除變量可以使用 rm() 函數(shù):
> rm(var.3) > print(ls()) [1] "var.1" "var.2" >
上一章節(jié)中我們已經(jīng)學(xué)會(huì)來(lái)如何安裝 R 的編程環(huán)境,接下來(lái)我們將為大家介紹 R 語(yǔ)言的交互式編程與文件腳本編程。
我們只需要在命令行中執(zhí)行 R 命令就可以進(jìn)入交互式的編程窗口:
R
執(zhí)行完這個(gè)命令后會(huì)調(diào)出 R 語(yǔ)言的解釋器,我們?cè)?> 符后面輸入代碼即可。
交互式命令可以通過(guò)輸入 q() 來(lái)退出:
> q() Save workspace image? [y/n/c]: y
R 語(yǔ)言文件后綴為 .R。
接下來(lái)我們創(chuàng)建一個(gè) nhooo-test.R 文件:代碼如下:
接下來(lái)我們?cè)诿钚写翱谑褂?Rscript 來(lái)執(zhí)行該腳本:
Rscript nhooo-test.R
輸出結(jié)果如下:
[1] "nhooo"
print() 是 R 語(yǔ)言的輸出函數(shù)。
和其他編程語(yǔ)言一樣,R 語(yǔ)言支持?jǐn)?shù)字、字符等輸出。
輸出的語(yǔ)句十分簡(jiǎn)單:
print("nhooo") print(123) print(3e2)
執(zhí)行結(jié)果:
[1] "nhooo" [1] 123 [1] 300
R 語(yǔ)言與 node.js 和 Python 一樣,是解釋型的語(yǔ)言,所以我們往往可以像使用命令行一樣使用 R 語(yǔ)言。
如果我們?cè)谝恍猩线M(jìn)輸入一個(gè)值,那么 R 也會(huì)把它直接標(biāo)準(zhǔn)化輸出:
> 5e-2 [1] 0.05
如果需要輸出結(jié)果的拼接,我們可以使用 cat() 函數(shù):
> cat(1, "加", 1, "等于", 2, '\n') 1 加 1 等于 2
cat() 函數(shù)會(huì)在每?jī)蓚€(gè)拼接元素之間自動(dòng)加上空格。
R 語(yǔ)言輸出到文件的方法十分多樣,而且很方便。
cat() 函數(shù)支持直接輸出結(jié)果到文件:
cat("nhooo", file="/Users/nhooo/nhooo-test/r_test.txt")
這個(gè)語(yǔ)句不會(huì)在控制臺(tái)產(chǎn)生結(jié)果,而是把 "nhooo" 輸出到 "/Users/nhooo/nhooo-test/r_test.txt" 文件中去。
file 參數(shù)可以是絕對(duì)路徑或相對(duì)路徑,建議使用絕對(duì)路徑,Windows 路徑格式為 D:\\r_test.txt。
cat("nhooo", file="D:\\r_test.txt")
注意:這個(gè)操作是"覆蓋寫(xiě)入"操作,請(qǐng)謹(jǐn)慎使用,因?yàn)樗鼤?huì)將輸出文件的原有數(shù)據(jù)清除。如果想"追加寫(xiě)入",請(qǐng)不要忘記設(shè)置 append 參數(shù):
cat("GOOGLE", file="/Users/nhooo/nhooo-test/r_test.txt", append=TRUE)
執(zhí)行以上代碼后,打開(kāi) r_test.txt 文件內(nèi)容如下:
nhoooGOOGLE
sink() 函數(shù)可以把控制臺(tái)輸出的文字直接輸出到文件中去:
sink("/Users/nhooo/nhooo-test/r_test.txt")
這條語(yǔ)句執(zhí)行以后,任何控制臺(tái)上的輸出都會(huì)被寫(xiě)入到 "/Users/nhooo/nhooo-test/r_test.txt" 文件中去,控制臺(tái)將不會(huì)顯示輸出。
注意:這個(gè)操作也是"覆蓋寫(xiě)入"操作,會(huì)直接清除原有的文件內(nèi)容。
如果我們依然像保留控制臺(tái)的輸出,可以設(shè)置 split 屬性:
sink("/Users/nhooo/nhooo-test/r_test.txt", split=TRUE)
如果想取消輸出到文件,可以調(diào)用無(wú)參數(shù)的 sink :
sink()
sink("r_test.txt", split=TRUE) # 控制臺(tái)同樣輸出 for (i in 1:5) print(i) sink() # 取消輸出到文件 sink("r_test.txt", append=TRUE) # 控制臺(tái)不輸出,追加寫(xiě)入文件 print("nhooo")
執(zhí)行以上代碼,當(dāng)前目錄下會(huì)生存一個(gè) r_test.txt 文件,打開(kāi)文件內(nèi)容如下:
[1] 1 [1] 2 [1] 3 [1] 4 [1] 5 [1] "nhooo"
控制臺(tái)輸出為:
[1] 1 [1] 2 [1] 3 [1] 4 [1] 5
可能我們會(huì)聯(lián)想到 C 語(yǔ)言中的 scanf 、Java 中的 java.util.Scanner,如果你學(xué)習(xí)過(guò) Python 可能對(duì) input() 函數(shù)更熟悉。但是 R 語(yǔ)言本身作為一種解釋型的語(yǔ)言,更類(lèi)似于一些終端腳本語(yǔ)言(比如 bash 或者 PowerShell),這些語(yǔ)言是基于命令系統(tǒng)的,本身就需要輸入和輸出且不適合開(kāi)發(fā)面向用戶(hù)的應(yīng)用程序(因?yàn)樗麄儽旧砭褪墙o最終用戶(hù)使用的)。因此 R 語(yǔ)言沒(méi)有專(zhuān)門(mén)再?gòu)目刂婆_(tái)讀取的函數(shù),文字輸入在 R 的使用中一直在進(jìn)行。
R 語(yǔ)言中有豐富的文件讀取函數(shù),但是如果純粹的想將某個(gè)文件中的內(nèi)容讀取為字符串,可以使用 readLines 函數(shù):
readLines("/Users/nhooo/nhooo-test/r_test.txt")
執(zhí)行結(jié)果:
[1] "nhoooGOOGLE"
讀取結(jié)果是兩個(gè)字符串,分別是所讀取的文件包含的兩行內(nèi)容。
注意:所讀取的文本文件每一行 (包括最后一行) 的結(jié)束必須有換行符,否則會(huì)報(bào)錯(cuò)。
除了文字的簡(jiǎn)單輸入輸出以外,R 還提供了很多輸入數(shù)據(jù)和輸出數(shù)據(jù)的方法,R 語(yǔ)言最方便的地方就是可以將數(shù)據(jù)結(jié)構(gòu)直接保存到文件中去,而且支持保存為 CSV、Excel 表格等形式,并且支持直接地讀取。這對(duì)于數(shù)學(xué)研究者來(lái)說(shuō)無(wú)疑是非常方便的。但是這些功能對(duì)于 R 語(yǔ)言的學(xué)習(xí)影響不大,我們將在之后的章節(jié)提到。
對(duì)于文件操作,我們需要設(shè)置文件的路徑,R 語(yǔ)言可以通過(guò)以下兩個(gè)行數(shù)來(lái)獲取和設(shè)置當(dāng)前的工作目錄:
getwd() : 獲取當(dāng)前工作目錄
setwd() : 設(shè)置當(dāng)前工作目錄
# 當(dāng)前工作目錄 print(getwd()) # 設(shè)置當(dāng)前工作目錄 setwd("/Users/nhooo/nhooo-test2") # 查看當(dāng)前工作目錄 print(getwd())
執(zhí)行以上代碼輸出結(jié)果為:
[1] "/Users/nhooo/nhooo-test" [1] "/Users/tianqixin/nhooo-test2"