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