如何读取空格分隔的字符串,直到R中的EOF

时间:2011-08-31 17:00:36

标签: string r input eof

我是R的新手,我目前在阅读一系列字符串时遇到麻烦,直到遇到EOF。不仅我不知道如何检测EOF,而且我也不知道如何读取由空格分隔的单个字符串,这在我到目前为止看到的任何其他语言中都是微不足道的。在C中,我只会这样做:

while (scanf("%s", s) == 1) { /* do something with s */ }

如果可能的话,我宁愿选择一种不需要事先了解字符串最大长度的解决方案。

有什么想法吗?

编辑:我正在寻找的解决方案并没有将所有输入存储到内存中,而是与上面的C代码等效或至少相似的那个。

2 个答案:

答案 0 :(得分:3)

> txt <- "This is an example"  # could be from a file but will use textConnection()
> read.table(textConnection(txt))
    V1 V2 V3      V4
1 This is an example

read.table是使用scan实现的,因此您只需查看代码即可了解专家是如何做到的。

答案 1 :(得分:3)

这是一种一次读取一个项目的方法......它使用scan具有nmax参数(以及nnlines - 这实际上是这样的事实有点乱!)。

# First create a sample file to read from...
writeLines(c("Hello world", "and now", "Goodbye"), "foo.txt")

# Use a file connection to read from...
f <- file("foo.txt", "r")

i <- 0L
repeat {
   s <- scan(f, "", nmax=1, quiet=TRUE)
   if (length(s) == 0) break
   i <- i + 1L
   cat("Read item #", i, ": ", s, "\n", sep="")
}
close(f)

当扫描遇到EOF时,它返回零长度向量。因此,更加模糊但类似C的方式是:

while (length(s <- scan(f, "", nmax=1, quiet=TRUE))) {
   i <- i + 1L
   cat("Read item #", i, ": ", s, "\n", sep="")
}

在任何情况下,输出都是:

Read item #1: Hello
Read item #2: world
Read item #3: and
Read item #4: now
Read item #5: Goodbye

最后,如果您可以对字符串进行矢量化,那么您应该尝试一次阅读一堆字符串 - 只需将nmax更改为10000