[Rd] readLines function with R >= 3.5.0
Michael Lawrence
l@wrence@mich@el @ending from gene@com
Wed Jun 13 04:27:49 CEST 2018
Hi Jen,
This was already resolved for R 3.5.1 by just disabling buffering on
terminal file connections like stdin.
Sounds like you might want to be running a web service or something
instead though.
Michael
On Tue, Jun 12, 2018 at 4:46 PM, Jennifer Lyon
<jennifer.s.lyon using gmail.com> wrote:
> Hi:
>
> I have also just stumbled into this bug. Unfortunately, I can not
> change the data my program receives from stdin. My code runs in a
> larger system and stdin is sent to a Docker container running my R
> code. The protocol is I read a line, readLines("stdin", n=1), do some
> actions, send output on stdout, and wait for the next set of data. I
> don't have control over this protocol, so I can't use the ^D
> workaround.
>
> I am open for other workaround suggestions. The single line is
> actually JSON and can be quite large. If there isn't something else
> cleaner, I am going to try readChar() in a while loop looking for \n
> but I'm guessing that would likely be too slow. I am open to other
> workaround solutions. For the moment I have reverted back to R 3.4.4.
>
> Thanks for any suggestions.
>
> Jen.
>
>
>>> >>>>> Martin Maechler
>>> >>>>> on Mon, 28 May 2018 10:28:01 +0200 writes:
>>>
>>> >>>>> Ralf Stubner
>>> >>>>> on Fri, 25 May 2018 19:18:58 +0200 writes:
>>>
>>> >> Dear all, I would like to draw you attention to this
>>> >> question on SO:
>>> >>
> https://stackoverflow.com/questions/50372043/readlines-function-with-new-version-of-r
>>>
>>>
>>> >> Based on the OP's code I used the script
>>>
>>> >> #######################################
>>> >> create_matrix <- function() {
>>> >> cat("Write the numbers of vertices: ")
>>> >> user_input <- readLines("stdin", n=1)
>>> >> user_input <- as.numeric(user_input)
>>> >> print(user_input)
>>> >> }
>>> >> create_matrix()
>>> >> #######################################
>>>
>>> >> and called it with "R -f <filename>" from the command line.
>>>
>>> >> With 'R version 3.4.4 (2018-03-15) -- "Someone to Lean On"' the
> script
>>> >> prints the inputed number as expected. With both 'R version 3.5.0
>>> >> (2018-04-23) -- "Joy in Playing"' and 'R Under development
> (unstable)
>>> >> (2018-05-19 r74746) -- "Unsuffered Consequences"' the script does
> not
>>> >> continue after inputing a number.
>>>
>>> > I can confirm.
>>> > It "works" if you additionally (the [Enter], i.e., EOL) you also
>>> > "send" an EOF -- in Unix alikes via <Ctrl>-D
>>>
>>> > The same happens if you use 'Rscript <filename>'
>>>
>>> > I'm not the expert here, but am close to sure that we (R core)
>>> > did not intend this change, when fixing other somewhat subtle
>>> > bugs in Rscript / 'R -f'
>>>
>>> > Martin Maechler
>>>
>>> The same behavior in regular R , no need for a script etc.
>>>
>>> > str(readLines("stdin", n=1))
>>>
>>> then in addition to the input you need to "give" an EOF (Ctrl D) in R
>>= 3.5.0
>>>
>>> Interestingly, everything works fine if you use stdin() instead
>>> of "stdin" :
>>>
>>> > rr <- readLines(stdin(), n=1)
>>> foo
>>> > rr
>>> [1] "foo"
>>> >
>>> ----------
>>>
>>> So, for now use stdin() which is much clearer than the string
>>> "stdin" anyway
>>>
>>> Martin Maechler
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list