1. 程式人生 > >R:連線鍵盤與顯示器(輸入和輸出)

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