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

String 如何在R中读取以空格分隔的字符串直到EOF,string,r,input,eof,String,R,Input,Eof,我是R新手,目前在阅读一系列字符串时遇到困难,直到遇到EOF。我不仅不知道如何检测EOF,而且我也不知道如何读取由空格分隔的单个字符串,这在我所见过的任何其他语言中都是微不足道的。在C中,我只需执行以下操作: while (scanf("%s", s) == 1) { /* do something with s */ } 如果可能的话,我更喜欢不需要事先知道字符串最大长度的解决方案 有什么想法吗 编辑:我正在寻找的解决方案不是将所有输入存储到内存中,而是与上面的C代码等效或至少类似的解决方案

我是R新手,目前在阅读一系列字符串时遇到困难,直到遇到EOF。我不仅不知道如何检测EOF,而且我也不知道如何读取由空格分隔的单个字符串,这在我所见过的任何其他语言中都是微不足道的。在C中,我只需执行以下操作:

while (scanf("%s", s) == 1) { /* do something with s */ }
如果可能的话,我更喜欢不需要事先知道字符串最大长度的解决方案

有什么想法吗

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

>txt read.table(textConnection(txt))
> 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
V1 V2 V3 V4 1这是一个例子

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

以下是一种一次读取一个项目的方法。。。它使用了一个事实,即
scan
有一个
nmax
参数(和
n
nlines
——实际上有点乱!)


最后,如果您可以将对字符串所做的操作矢量化,您可能应该尝试一次读取一组字符串-只需将
nmax
更改为,例如,
10000

readLines
默认情况下读取文本,直到文件结束我尝试了扫描,但它似乎一直读取到遇到EOF为止。我想一个接一个地读取字符串,因为我正在读取数百万个字符串(我更新了问题)。但这会将所有内容加载到内存中,对吗?我需要以一种节省内存的方式来做,就像C版本一样。我更新了原始帖子。将数据加载到内存是“R方式”。如果你想要一种编译语言,那么就使用一种编译语言。@dwn-我认为一次读一个项目,然后对它进行大量的计算仍然适合R范式?你说得对。文件连接还应与任何基于
扫描的解决方案配合使用。
# 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)
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