Как читать строки, разделенные пробелами, до EOF в R - PullRequest
3 голосов
/ 31 августа 2011

Я новичок в R, и в настоящее время у меня возникают проблемы с чтением ряда строк, пока я не столкнусь с EOF.Я не только не знаю, как определить EOF, но я также не знаю, как прочитать одну строку, разделенную пробелом, что тривиально сделать на любом другом языке, который я видел до сих пор.В C я бы просто сделал:

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

Если возможно, я бы предпочел решение, которое не требует заранее знать максимальную длину строк.

Есть идеи?

РЕДАКТИРОВАТЬ: Я ищу решение, которое не хранит все входные данные в памяти, но один эквивалент или, по крайней мере, аналогично коду C выше.

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

Вот способ читать по одному элементу за раз ... Он использует тот факт, что scan имеет параметр nmaxn и 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.

3 голосов
/ 31 августа 2011
> 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, так что вы можете просто посмотреть на код, чтобы увидеть, как это сделали эксперты.

...