[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