R:連線鍵盤與顯示器(輸入和輸出)
R提供多個命令來連線鍵盤和顯示器。
►使用scan()函式
可以使用scan()從檔案中讀取或者用鍵盤輸入一個向量,它可以是數值型或字元型向量。再增加一些操作,甚至可以讀取資料來形成一個列表。
scan()可以快速的一次讀取整個檔案。
scan(file = "", what = double(0), nmax = -1, n = -1, sep = "",quote = if (sep=="\n") "" else "'\"", dec = ".",skip = 0, nlines = 0, na.strings = "NA",flush = FALSE, fill = FALSE, strip.white = FALSE, quiet = FALSE,blank.lines.skip = TRUE, multi.line = TRUE, comment.char = "")
函式scan()預設選項及說明
選項值 |
說明 |
file |
檔名在(""之內),可能包含它的路徑,或者使用一個URL連結。如果file="",資料從鍵盤輸入(使用一個空白行終止輸入) |
what |
指定資料的型別(預設值為數值型) |
nmax |
要讀取資料的最大數量,如果what是一個列表,nmax則是可以讀取的行數(在預設情況下,scan讀取到檔案最末端為止的所有資料) |
n |
要讀取資料的最大數量(在預設情況下,沒有限制) |
sep |
檔案中的欄位分隔符 |
quote |
用來包圍字元型值 |
dec |
用來表示小數點的字元 |
skip |
在讀取資料前跳過的行數 |
nlines |
要讀取的行數 |
na.string |
表示確實資料的字串(轉化為NA) |
flush |
一個邏輯值,如果為TRUE,當讀取完指定列數後scan將轉到下一行(這樣就允許使用者在資料檔案中添加註釋,即新增在指定列數後) |
fill |
如果為TRUE,且非所有的行中變數數目相同,則用空白填補 |
strip.white |
在sep已制定的情況下,如果為TRUE,則刪除字元型變數前後多餘的空格 |
quiet |
一個邏輯值,如果為FALSE,scan顯示一行資訊說明哪些欄位被讀取 |
blank.lines.skip |
如果為TRUE,忽略空白行 |
multi.line |
當what是一個列表時,若為FALSE則表示列表中每個個體的所有變數都在同一行中 |
comment.char |
指定註釋開始字元,一行中以這個字元開頭的部分將被忽略(缺少禁用此選項) |
> scan( "D:/RCodes/z1.txt" )
Read 4 items
[1] 123 4 5 6
> scan( "D:/RCodes/z2.txt" )
Read 4 items
[1] 123.0 4.2 5.0 6.0
> scan( "D:/RCodes/z3.txt" )
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
scan() expected 'a real', got 'abc'
> scan( "D:/RCodes/z3.txt", what="" )
Read 4 items
[1] "abc" "de" "f" "g"
第一次呼叫,得到了四個整陣列成的向量(仍然是數值型)。
第二次呼叫,因為有一個數字不是整數,所以其他數也以浮點數的形式儲存。
第三次呼叫,出現了一個錯誤提示。scan()函式有一個可選引數what用來設定變數的模式(mode),預設為double模式。由於檔案z3.txt的內容不是數值,所以出現錯誤,再嘗試一次,設定what=””,此舉把字元賦值給what,表明我們想要字元模式(也可以設定what為任何字串)。
最典型的用法是把scan()的返回值賦給一個變數。
> v <- scan( "D:/RCodes/z1.txt" )
Read 4 items
> v
[1] 123 4 5 6
預設情況下,scan()假定向量的各項之間是以“空白字元(whitespace)”作為分隔,空白字元包括空格、回車/換行符和水平製表符。如果是其他分隔符,可以用可選引數sep來設定。例如,可以把sep設定為換行符,把每一行當作一個字串讀入。
> scan( "D:/RCodes/z1.txt", what="", sep="\n" )
Read 3 items
[1] "123" "4 5" "6"
也可以用scan()函式從鍵盤讀取資料,只需要把檔名設定為一個空字串,然後用鍵盤錄入資料。
> v <- scan( "" )
1: 12 5 3
4: 3 4 6
7: 8
8:
Read 7 items
> v
[1] 12 5 3 3 4 6 8
命令列在每行行首提示的數字是下一個輸入項的索引,鍵入一個空行表示結束輸入。如果不希望scan()報告已讀取的專案數,可以設定引數quiet=TRUE。
►使用readline()函式
如果想從鍵盤輸入單行資料,用readline()函式會非常方便。
> w <- readline()
It is a R program.
> w
[1] "It is a R program."
一般來說,呼叫readline()時可以指定一個提示語字串作為引數,這個引數是可選的。
> w <- readline("Please type your initial:")
Please type your initial:It is a R program.
> w
[1] "It is a R program."
►輸出到顯示器
在互動模式的頂層,你只需要簡單鍵入變數名或者表示式,就能輸出變數或表示式的值。但如果要在函式體內部列印變數或者表示式的值,就需要使用print()函式。
> x <- 1 : 5
> x
[1] 1 2 3 4 5
> print( 2 * x )
[1] 2 4 6 8 10
print()是一個泛型函式,所以其實際呼叫的函式依賴於所列印物件的類別。cat()比print()稍微好用一點,因為後者只可以輸出一個表示式,而且輸出內容帶編號,這可能會造成干擾。
> print( "abc" )
[1] "abc"
> cat( "abc\n" )
abc
注:在呼叫cat()時需要一個行結束字元“\n”,如果沒有它,下一次呼叫cat()函式還會在同一行輸出內容。
用cat()列印的各個引數是以空格分隔的。如果不想用空格分隔,可以把sep設定為各種字元,也可以把sep設定為字串向量。
> cat( x, "R", "abc\n" )
1 2 3 4 5 R abc
> cat( x, "R", "abc\n", sep="" )
12345Rabc
> cat( x, "R", "abc\n", sep="\n" )
12345Rabc
> cat( x, sep=c( ".", " ", "\n", "." ) )
1.2 34.5