2013-05-11 2 views
2

J'utilise:Comment lire les entrées du terminal en utilisant/dev/stdin et read.csv()?

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

J'essaie d'utiliser read.csv pour saisir un peu de données CSV + snippet tête, directement à partir du terminal.

Je rencontre un problème qui peut être lié à R skips lines from /dev/stdin et read.csv, header on first line, skip second line mais est assez différent (les réponses n'expliquent pas ce que je vois ici) pour justifier une question distincte.

R semble ignorer la ligne d'en-tête et traiter la seconde (données) en ligne en-tête:

R> d <- read.csv(file='/dev/stdin', header=TRUE) 
a,b 
1,2 
3,4 
# hit CTRL-D twice here to end the input 
# (this is also unexpected: 
# when reading a few lines interactively in bash, one CTRL-D suffices. 
# Why is doing it twice necessary in R?) 

R> d 
    X1 X2 
1 3 4 

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

Je trouve une solution de contournement: puisque par défaut read.csv a blank.lines.skip = TRUE, je préfixe l'entrée avec des lignes vides. 5 lignes vides avant de commencer l'entrée, semblent être le minimum requis pour que cela fonctionne comme prévu. BTW: une seule ligne avec 5 places fonctionne tout aussi bien, faisant allusion à un octet 5 (ou plus) nécessaire rembourrage des espaces:

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





a,b 
1,2 
3,4 
# Enter CTRL-D twice here to mark the end of terminal input 

R> d 
    a b 
1 1 2 
2 3 4 

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

Questions:

  • Pourquoi pas le 1er exemple de travail comme attendu?
  • Pourquoi 5 lignes ou espaces vides sont-ils nécessaires (même 4 ne suffisent pas) pour que cela fonctionne?
  • Existe-t-il un meilleur moyen de lire un court extrait CSV directement à partir du terminal? (je sais scan et readLines, mais mes données sont au format csv déjà, donc je veux qu'il soit aussi simple à lire/parse/Assign possible)
+0

Je pense que la réponse dans le premier lien que vous avez posté peut effectivement être applicable. R semble créer un tampon de 4 octets sur '/ dev/stdin'. En outre, comme mentionné dans le commentaire, vous pouvez utiliser 'stdin' à la place, et il semble fonctionner correctement. (Bien que je ne comprends toujours pas pourquoi vous devez appuyer deux fois sur Ctrl + D). – nograpes

+0

Merci @nograpes! Pouvez-vous écrire une réponse courte avec un exemple de travail? Je vais l'accepter avec plaisir. Le 1er lien montre qu'un tampon de 4 Ko est "mangé" alors que dans ce cas seulement 5 octets sont nécessaires, donc il semble que ce soit deux problèmes différents. Aussi: cet exemple est beaucoup plus minimaliste et peut donc être plus utile. – arielf

Répondre

5

Je pense que la réponse dans le premier lien que vous posté peut effectivement être applicable. R semble créer un tampon de 4 octets sur/dev/stdin. En outre, comme mentionné dans le commentaire, vous pouvez utiliser stdin à la place, et il semble fonctionner correctement. (Bien que je ne comprends toujours pas pourquoi vous devez appuyer deux fois sur 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 
+0

Merci beaucoup. Cette solution de contournement fonctionne. Je me demande simplement si 'stdin' se comporte différemment que '/ dev/stdin' n'est pas un bogue dans le sous-système R io. Je n'ai jamais vu/dev/stdin 'se comporter mal en utilisant d'autres programmes. Aussi le double CTRL-D requis m'inquiète un peu. – arielf

+0

@arielf Oui, je soupçonne la même chose ... mais les développeurs de R sont très sensibles quand il s'agit de rapporter des bugs dans 'base'. Donc, vous feriez mieux d'être sûr que vous avez fait la recherche avant de signaler cela. – nograpes

Questions connexes