Подтвердить что ты не робот

R - Чтение STDIN по строкам

Я хочу передать большую таблицу данных в 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);

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

4b9b3361

Ответ 1

Я думаю, было бы разумнее использовать функцию 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 или использовать циклы стиля приложения.