Вопрос по stdin, input, r, linux – Как читать ввод с терминала, используя / dev / stdin и read.csv ()?

2

м с помощью:

R version 3.0.0 (2013-04-03) -- "Masked Marvel"
Platform: x86_64-pc-linux-gnu (64-bit)

Я пытаюсь использоватьread.csv для ввода небольшого фрагмента данных CSV + заголовка непосредственно из терминала.

Я столкнулся с проблемой, которая может быть связана сR пропускает строки из / dev / stdin а такжеread.csv, заголовок в первой строке, пропустить вторую строку но достаточно отличается (ответы там необъяснить то, что я вижу здесь), чтобы оправдать отдельный вопрос.

Кажется, что R пропускает строку заголовка и обрабатывает вторую строку (данные) как заголовок:

R> d  d
  X1 X2
1  3  4

R> colnames(d)
[1] "X1" "X2"

Я нашел обходной путь: так как по умолчаниюread.csv имеетblank.lines.skip = TRUE, Я ставлю ввод перед некоторыми пустыми строками. 5 пустых строк перед началом ввода - это минимум, необходимый для того, чтобы все заработало как положено. Кстати, одна строка с 5 пробелами работает так же хорошо, намекая на 5-байтовый (или более) требуемый заполнитель пробелов:

R> d  d
  a b
1 1 2
2 3 4

R> colnames(d)
[1] "a" "b"

Вопросы:

Почему нетt первый пример работает как положено?Зачем нужны 5 пустых строк или пробелов (даже 4Достаточно), чтобы это сработало?Есть ли лучший способ прочитать короткий фрагмент CSV прямо из терминала? (Я знаю оscan а такжеreadLines, но мои данные уже в формате csv, поэтому я хочу сделать его как можно более простым для чтения / анализа / назначения)
Спасибо @nograpes! Можете ли вы написать короткий ответ с рабочим примером? Я'Я с радостью приму это. 1-я ссылка показывает, что буфер 4 КБ находится "съедена» в то время как в этом случае нужны только 5 байтов, так что, похоже, это две разные проблемы. Кроме того: этот пример гораздо более минималистичен и может быть более полезным. arielf
Я думаю, что ответ в первой ссылке, которую вы разместили, может быть применим. R появляется, чтобы создать 4-байтовый буфер на/dev/stdin, Также, как уже упоминалось в комментарии, вы можете использоватьstdin вместо этого, и, кажется, работает нормально. (Хотя я до сих пор нене понимаю, почему вы должны нажать Ctrl + D дважды). nograpes

Ваш Ответ

1   ответ
6

Я думаю, что ответ в первой ссылке, которую вы разместили, может быть применим. Похоже, R создает 4-байтовый буфер в / dev / stdin. Кроме того, как уже упоминалось в комментарии, вы можете использовать вместо него стандартный ввод, и, похоже, он работает нормально. (Хотя я до сих пор нене понимаю, почему вы должны нажать Ctrl + D дважды).

d <- read.csv(file='stdin', header=TRUE)
a,b
1,2
3,4
# Hit Control+D twice.
> d
  a b
1 1 2
2 3 4
@arielf Да, я подозреваю то же самое ... но люди из R dev довольно обидчивы, когда дело доходит до сообщения об ошибках вbase, Поэтому вам лучше убедиться, что вы провели исследование, прежде чем сообщать об этом. nograpes
Спасибо. Этот обходной путь работает. Мне просто интересно, еслиSTDIN' вести себя иначе, чем/ DEV / STDIN' ISN»ошибка в подсистеме R io. Я никогда не видел / dev / stdin ' неправильно себя ведёт с помощью других программ. Также требуемый двойной CTRL-D беспокоит меня немного. arielf

Похожие вопросы