我可以在R中写入和访问内存中的文件吗?

时间:2012-10-17 17:53:00

标签: r

我正在为导入xml文件的{R}函数settings.xml编写测试。

目前,当我为依赖于foo.xml内容的函数编写测试时,包括以下示例中的函数read.settings

writeLines("<fee><fi><\fi>\fee>", con = "/tmp/foo.xml")
settings <- read.settings("/tmp/foo.xml")
file.remove("/tmp/foo.xml")

但是,出现了许多与使测试系统无关的问题。例如,/tmp/可能无法写入或read.settings()中的错误会在测试目录中留下孤立文件等。这是一个简单的示例,我可以想办法解决这些问题,但我记得回答上一个问题的解决方案,我现在找不到,其中con不是文件而是内存中的对象。我确信在很多情况下,不实际编写文件是有用的。

  • 有没有办法编写和访问仅存在于内存中的伪文件?
  • 记录的功能在哪里?
    ?connections似乎是一个很好的领导,但我不清楚如何使用提供的信息

跟进(但不要太开放)

  • 除了上面描述的内容之外,这种功能的主要用途是什么?
  • 是否应该使用此功能的情况?

2 个答案:

答案 0 :(得分:5)

这是一个可能有用的结构。 tempfile()在任何操作系统上返回临时文件的有效名称,对on.exit(unlink())的调用可确保删除临时文件,无论发生什么。

test1 <- function() {
    temp <- tempfile()
    on.exit(unlink(temp))
    writeLines("<fee><fi><\fi>\fee>", con = temp)
    settings <- readLines(temp)
    settings
}

test1()
# [1] "<fee><fi><\fi>\fee>"

答案 1 :(得分:4)

您可以将任何字符串转换为与textConnection的连接。

xml.txt <- '<fee><fi><\fi>\fee>'
con <- textConnection(xml.txt)
settings <- read.settings(con)

我发现字符串连接在连接函数对于您正在执行的操作很方便的情况下很有用,但所涉及的任务将导致磁盘上的文件长时间处于打开状态。您可以使用文本连接作为缓冲区。

注意,在使用文件连接的方式读取文本连接后,不能使用seek重置文本连接的位置。