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
etreadLines
, mais mes données sont au format csv déjà, donc je veux qu'il soit aussi simple à lire/parse/Assign possible)
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
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