R - чтение STDIN построчно - PullRequest
12 голосов
/ 26 марта 2012

Я хочу передать большую таблицу данных в R LINE BY LINE и, если текущая строка имеет определенное условие (скажем, первые столбцы> 15), добавить строку в кадр данных в памяти.Я написал следующий код:

count<-1;
Mydata<-NULL;
fin <- FALSE;
while (!fin){
    if (count==1){
        Myrow=read.delim(pipe('cat /dev/stdin'), header=F,sep="\t",nrows=1);
        Mydata<-rbind(Mydata,Myrow);
        count<-count+1;
    }
    else {
        count<-count+1;
        Myrow=read.delim(pipe('cat /dev/stdin'), header=F,sep="\t",nrows=1);
        if (Myrow!=""){
        if (MyCONDITION){
            Mydata<-rbind(Mydata,Myrow);
        }
        }
        else
        {fin<-TRUE}
    }
}
print(Mydata);

Но я получаю сообщение об ошибке «данные недоступны».Обратите внимание, что у меня большие данные, и я не хочу читать их все сразу и применить свое условие (в данном случае это было легко).

1 Ответ

12 голосов
/ 26 марта 2012

Я думаю, что было бы разумнее использовать функцию R, такую ​​как readLines.readLines поддерживает только чтение указанного количества строк, например 1. Объедините это с открытием сначала соединения file, а затем многократным вызовом readLines, который даст вам то, что вы хотите.При многократном вызове readLines следующие n строки считываются из соединения.В коде R:

stop = FALSE
f = file("/tmp/test.txt", "r")
while(!stop) {
  next_line = readLines(f, n = 1)
  ## Insert some if statement logic here
  if(length(next_line) == 0) {
    stop = TRUE
    close(f)
  }
}

Дополнительные комментарии:

  • R имеет внутренний способ обработки stdin как файла: stdin().Я предлагаю вам использовать это вместо использования pipe('cat /dev/stdin').Это, вероятно, делает его более надежным и определенно более кроссплатформенным.
  • Вы инициализируете Mydata в начале и продолжаете наращивать его, используя rbind.Если количество строк, которое вы rbind, увеличится, это будет очень медленно.Это связано с тем, что когда объект растет, ОС должна найти для него новую область памяти, что в итоге занимает много времени.Лучше предварительно выделить MyData или использовать циклы применений стиля.
...