R:如何做RAII(或类似的资源管理)

时间:2012-02-29 19:32:13

标签: r raii

我正在使用具有“openConnection”功能的专有库,我使用它:

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

无论当前方法如何退出,确保连接关闭的R语言是什么?在C ++中它将是RAII,在Java中它可能是一个“最终”块。 R是什么?

1 个答案:

答案 0 :(得分:1)

通常,只使用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