Connections
前面可以看到對於檔案一次性的存取,前一篇介紹的函式底層實際上是對進行一連串的操作:建立連結 -> 對檔案進行操作 -> 關閉連結。像read.csv()
只需要檔案名稱作為參數,就會自動建立與csv檔案的連結,讀取資料內容轉為R可用的格式,然後關閉連結。
建立連結可以自己定義如何操作檔案、資料庫、網路...等等,在別的語言叫做stream,可以想像是連接來源與目的的管子(pipe),而有些種類的管子裡面有一些"filter"可以把讀到的二進位檔案翻譯成文字輸出...。
(還沒念到,先猜)連結之間可以互相串接,只要連結之間的介面資料傳輸形式是相同的。
連結相關函式
詳細參照Functions to Manipulate Connections
建立連結:
下列函式回傳一個connection物件:
函式 | 說明 |
---|---|
file() |
與檔案建立連結。 |
gzfile() 、bzfile() 、xzfile() |
與相對應的壓縮檔格式(gzip、bzip2、xz)建立連結。 |
unz() |
與zip檔案建立連結,與上面不同的是以binary的方式建立。 |
url() |
根據url建立連結。 |
可以指定open參數以寫入或唯獨模式來打開檔案:
- "r":read,唯獨。
- "a":append,將新的資料附加在原始檔案最後面。
- "w":write,寫入模式,原始檔案會被覆蓋。
對連結的操作
函式 | 說明 |
---|---|
readLines() 、writeLines() |
從檔案或資料流逐行讀寫資料(最重要)。 |
unserialize() 、serialize() |
將R Object序列化為二進位或從二進位還原,方便進一步輸出入(新手跳過)。 |
fulsh() |
清空連結內資料。 |
open() |
打開file() 等等回傳的連結。 |
Close() |
手動關閉連結釋放記憶體資源。 |
說明:
- 基於傳輸效率上的理由,連結將資料從來源讀入後會累積一定的資料量再輸出至目的地,有時候連結讀完資料了但是在連結內的資料如果還沒達到輸出的資料量,這時候把連結直接關掉會造成一些資料遺失,
flush()
就是用來清空連結內資料的函式。 file()
等等函式回傳的連結預設是"關閉"狀態,某些情況下需要用open()
打開。
其他函式
函式 | 說明 |
---|---|
isOpen(connection) |
檢查連結是否打開,回傳一個logical。 |
isIncomplete(connection) |
檢查連結從來源讀取的動作是否已完成,回傳一個logical。 |
範例
打開一個文字檔(有8行)
建立一個連結
> con <- file("D:/test", "r")
> con
description class mode text opened can read
"D:/test" "file" "r" "text" "closed" "yes"
can write
"no"
#指定讀的行數
> readLines(con, 5)
[1] "a" "b" "c" "d" "e"
#如果不指定給c,預設是輸出到stdout()
> c <- readLines(con, 5)
#c果然是裝character的vector
> typeof(c)
[1] "character"
> c[0]
character(0)
> c[1]
[1] "a"
#呼叫關閉的連結會出現錯誤。
> close(con)
> con
Error in summary.connection(x) : invalid connection