Предупреждение: закрытие неиспользуемого соединения n - PullRequest
22 голосов
/ 10 июня 2011
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") 

1 Ответ

39 голосов
/ 10 июня 2011

readLines() - это функция, вы не close() это.Вы хотите закрыть соединение, открытое функцией file().Кроме того, вы return() ing перед тем, как закроете все соединения.Что касается функции, то строки после оператора 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, если функция завершается по какой-либо причине, соединение будетбыть закрытымЕсли вы оставили это только для оператора close(con) непосредственно перед последней строкой, например:

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

, функция может завершиться ошибкой при вызове readLines() и завершиться, поэтому соединение не будет закрыто.on.exit() обеспечивает закрытие соединения, даже если функция завершается досрочно.

...