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]]
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 at 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 at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>> Michael Lawrence >>>>> on Tue, 12 Jun 2018 19:27:49 -0700 writes:> Hi Jen, This was already resolved for R 3.5.1 by just > disabling buffering on terminal file connections like stdin. and before R 3.5.1 exists, *and* as the change is also not yet available in R patched (!) this means using a version of "R-devel", e.g. for Windows available from https://cloud.r-project.org/bin/windows/base/rdevel.html Martin > 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 at 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 at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel