2014-06-25 53 views
1

這是一個涉及以下代碼塊的兩部分問題。關閉連接後立即刪除連接對象

> ## ran rm(list = ls()) prior to the following 
> closeAllConnections() 
> tc <- textConnection("messages", "w") 
> isOpen(tc) 
# [1] TRUE 
> close(tc) 
> ls() 
# [1] "messages" "tc" 
> is.object(tc) 
# [1] TRUE  
> class(tc) 
# [1] "textConnection" "connection"  
> tc 
# Error in summary.connection(x) : invalid connection 
  1. 爲什麼不tc從對象列表中刪除,ls(),立即在tc連接被關閉,又是什麼意思invalid connection?爲什麼R在列表中保留tc

  2. 有沒有辦法在關閉後立即從對象列表中刪除它?如果沒有必要,我真的不想打rm()。也許我在掃描幫助文件的時候在某個地方錯過了一個參數。

的原因,這是很重要的,因爲我有一個叫list.objects返回後,我運行上面的代碼中的錯誤的功能,但不以其他方式(可能是因爲tc有兩類)。

+0

用NULL對象打開'textConnection'在該函數的幫助頁面上似乎沒有記錄的行爲。你在期待什麼? –

+0

我爲這個例子寫了'NULL'。但在我的實際代碼中,連接的名稱是「messages」。我會編輯。同樣的行爲發生雖然 –

回答

1

對於1.,tc不會從對象列表中刪除,因爲close不會刪除用於包含指向該連接的指針的變量。相反,關閉關閉指針並將其從打開的文件連接列表中有效地移除(請參閱showConnections)。包含指針的變量仍然存在,只是指針指向無處。這就解釋了爲什麼當你在關閉它後鍵入tc時出現錯誤,你正在嘗試查看無法連接的文件連接。

對於2.,close(tc); rm(tc)有什麼難的?幾乎沒有比實際存在「刪除我的第一個參數」參數更多的輸入。

1

tc是一個變量,持有對某些狀態的引用。沒有特別原因,close()的呼叫應該與內置的rm()一起來。這就好比在您按下電源按鈕關閉電視後,電視遙控器會自行消失。我想你將不得不打電話rm(tc)刪除它。

+1

尼斯類比:) – jbaums

+0

謝謝。無論如何,我認爲'rm(tc)'可能是我所有執行中最短的一個,按字節順序。 –

+0

@jbaums,謝謝。我認爲現實世界中的類比可以幫助我們擺脫比特和字節的世界。 :) – merlin2011