web-dev-qa-db-ja.com

警告:未使用の接続nを閉じています

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") 
22
Eva

readLines()は関数であり、close()ではありません。 file()関数によって開かれた接続を閉じたい。また、あなたはreturn() ing before接続を閉じます。関数に関する限り、return()ステートメントの後の行は存在しません。

1つのオプションは、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が作成された後、何らかの理由で関数が終了した場合、接続が閉じられるようにしました。これを最後の行の直前のclose(con)ステートメントに残した場合:

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

関数はreadLines()呼び出しで失敗して終了する可能性があるため、接続は閉じられません。 on.exit()は、関数が早期に終了した場合でも、接続を閉じるように調整します。