R: как сделать RAII (или аналогичное управление ресурсами) - PullRequest
2 голосов
/ 29 февраля 2012

Я использую проприетарную библиотеку с функцией openConnection, которую я использую следующим образом:

conn <- openConnection("user", "pass")
# do some stuff with 'conn' that may return early or throw exceptions
closeConnection(conn)

Что такое R-идиома, чтобы убедиться, что соединение закрывается независимо от текущего методаполучает выход.В C ++ это будет RAII , в Java это, вероятно, будет блок "finally".Что это в R?

1 Ответ

1 голос
/ 29 февраля 2012

Как правило, используется только вызов on.exit, но вам нужно сделать это внутри функции.

f <- function() {
  conn <- openConnection("user", "pass")
  on.exit(close(conn))

  # use conn...
  readLines(conn)

} # on.exit is run here...

Обычный случай, когда вы получаете соединение или имя файла, и выследует создавать (и закрывать) соединение, только если вы получили имя файла:

myRead <- function(file) {
  conn <- file
  if (!inherits(file, "connection")) {
      conn <- file(file, "r")
      on.exit(close(conn))
  } # else just use the connection...

  readLines(conn)

} # on.exit runs here...

# Try it out:
cat("hello\nworld\n", file="foo.txt")

myRead("foo.txt") # file
myRead(stdin())   # connection
...