readLines() for non-blocking pipeline behaves differently in R 3.5
The issue is that readLines() tries to seek (for reasons I don't understand) in the non-blocking case, but silently fails for "stdin" since it's a stream. This confused the buffering logic. The fix is to mark "stdin" as unable to seek, but I do wonder why readLines() is seeking in the first place. Anyway, I'll get this into patched ASAP. Thanks for the report. Michael
On Wed, Apr 25, 2018 at 5:13 PM, Michael Lawrence <michafla at gene.com> wrote:
Probably related to the switch to buffered connections. I will look into this soon. On Wed, Apr 25, 2018 at 2:34 PM, Randy Lai <randy.cs.lai at gmail.com> wrote:
It seems that the behavior of readLines() in R 3.5 has changed for non-blocking pipeline.
Consider the following R script, which reads from STDIN line by line.
```
con <- file("stdin")
open(con, blocking = FALSE)
while (TRUE) {
txt <- readLines(con, 1)
if (length(txt) > 0) {
cat(txt, "\n", file = stdout())
}
Sys.sleep(0.1)
}
close(con)
```
In R 3.4.4, it works as expected.
```
(randymbpro)-Desktop$ echo "abc\nfoo" | R --slave -f test.R
abc
foo
```
In R 3.5, only the first line is printed
```
(randymbpro)-Desktop$ echo "abc\nfoo" | R --slave -f test.R
abc
```
Is this change expected? If I change `blocking` to `TRUE` above, the above code would
work. But I need non-blocking connection in my use case of piping buffer from
another program.
Best,
R 3.5 @ macOS 10.13
Randy
[[alternative HTML version deleted]]
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel