我是R的新手,我目前在阅读一系列字符串时遇到麻烦,直到遇到EOF。不仅我不知道如何检测EOF,而且我也不知道如何读取由空格分隔的单个字符串,这在我到目前为止看到的任何其他语言中都是微不足道的。在C中,我只会这样做:
while (scanf("%s", s) == 1) { /* do something with s */ }
如果可能的话,我宁愿选择一种不需要事先了解字符串最大长度的解决方案。
有什么想法吗?
编辑:我正在寻找的解决方案并没有将所有输入存储到内存中,而是与上面的C代码等效或至少相似的那个。
答案 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
参数(以及n
和nlines
- 这实际上是这样的事实有点乱!)。
# 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
。