2011-06-10 67 views
18
getCommentary=function(){ 
    Commentary=readLines(file("C:\\Commentary\\com.txt")) 
    return(Commentary) 
    close(readLines) 
    closeAllConnections() 
} 

我不知道這個功能有什麼問題。當我R中運行它,它不斷給我下面的警告:警告:關閉未使用的連接ñ

Warning message: 
closing unused connection 5 ("C:\\Commentary\\com.txt") 

回答

34

readLines()是一個函數,你不close()它。您想要關閉由file()功能打開的連接。此外,你是return()荷蘭國際集團關閉任何連接前。就功能而言,return()聲明之後的行不存在。

一種選擇是保存由file()調用返回的對象,你不應該關閉所有連接只有你的函數打開。這裏是一個非功能版本來說明這個想法:

R> cat("foobar\n", file = "foo.txt") 
R> con <- file("foo.txt") 
R> out <- readLines(con) 
R> out 
[1] "foobar" 
R> close(con) 

要輸入功能,不過,我可能會採取略有不同的策略:

getCommentary <- function(filepath) { 
    con <- file(filepath) 
    on.exit(close(con)) 
    Commentary <-readLines(con) 
    Commentary 
} 

這是使用如下,與上面創建作爲實例文件中的文本文件中讀取從

R> getCommentary("foo.txt") 
[1] "foobar" 

我用on.exit()使得一旦con被創建,如果函數終止時,爲瓦特討厭的原因,連接將被關閉。如果你只是最後一行,例如:

Commentary <-readLines(con) 
    close(con) 
    Commentary 
} 

功能可能無法在readLines()呼叫和終止前離開這只是一個close(con)語句,所以該連接不會被關閉。即使函數提前終止,on.exit()也會安排連接關閉。

+3

或者根本就沒有使用文件。閱讀線與路徑一起工作。 – hadley 2011-06-12 15:25:16

+2

@ hadley的評論是明智的(不出所料):更喜歡基礎行爲,這種行爲構建良好,可以自己管理與他們打交道的關係。話雖如此,我將上面的答案投給了「on.exit」的例子,對於那些明智的建議不適用的一般情況。 – 2013-10-15 01:36:54

+0

@MattTenenbaum:如果我使用'VAR1 <打開一個文件 - readlines方法( 「FILENAME.TXT」,編碼= 「UTF-8」)'。我不需要關閉它嗎? – discipulus 2016-02-15 13:14:53