2 votes

Comment lire l'entrée à partir du terminal en utilisant /dev/stdin et read.csv()?

Je suis en train d'utiliser :

Version R 3.0.0 (2013-04-03) -- "Masked Marvel"
Plateforme : x86_64-pc-linux-gnu (64 bits)

J'essaie d'utiliser read.csv pour entrer un petit extrait de données CSV + en-tête, directement depuis le terminal.

Je rencontre un problème qui pourrait être lié à R saute des lignes depuis /dev/stdin et read.csv, en-tête sur la première ligne, sauter la deuxième ligne mais c'est suffisamment différent (les réponses là-bas n'expliquent pas ce que je vois ici) pour justifier une question distincte.

Il semble que R saute la ligne d'en-tête et traite la deuxième ligne (de données) comme un en-tête :

R> d <- read.csv(file='/dev/stdin', header=TRUE) 
a,b
1,2
3,4
# appuyez sur CTRL-D deux fois ici pour terminer l'entrée
# (c'est aussi inattendu :
#  lors de la lecture de quelques lignes de manière interactive dans bash, un CTRL-D suffit.
#  Pourquoi est-il nécessaire d'appuyer deux fois en R ?)

R> d
  X1 X2
1  3  4

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

J'ai trouvé une solution de contournement : étant donné que par défaut read.csv a blank.lines.skip = TRUE, je préfixe l'entrée avec quelques lignes vides. 5 lignes vides avant de commencer l'entrée semblent être le minimum requis pour que cela fonctionne comme prévu. Au fait : une seule ligne avec 5 espaces fonctionne tout aussi bien, ce qui laisse penser à un rembourrage d'au moins 5 octets requis :

R> d <- read.csv(file='/dev/stdin', header=TRUE)

a,b
1,2
3,4
# Appuyez sur CTRL-D deux fois ici pour marquer la fin de l'entrée du terminal

R> d
  a b
1 1 2
2 3 4

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

Questions :

  • Pourquoi le premier exemple ne fonctionne-t-il pas comme prévu ?
  • Pourquoi faut-il 5 lignes vides ou des espaces (même 4 ne suffisent pas) pour que cela fonctionne ?
  • Existe-t-il une meilleure façon de lire un court extrait de CSV directement depuis le terminal ? (Je connais scan et readLines, mais mes données sont déjà au format CSV, donc je veux le rendre aussi simple que possible à lire/analyser/assigner)

6voto

nograpes Points 11530

Je pense que la réponse dans le premier lien que vous avez posté pourrait en fait être applicable. R semble créer un tampon de 4 octets sur /dev/stdin. De plus, comme mentionné dans le commentaire, vous pouvez utiliser stdin à la place, et cela semble fonctionner correctement. (Bien que je ne comprenne toujours pas pourquoi vous devez appuyer sur Ctrl+D deux fois).

d <- read.csv(file='stdin', header=TRUE)
a,b
1,2
3,4
# Appuyez deux fois sur Ctrl+D.
> d
  a b
1 1 2
2 3 4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X