Yes, that's the essence of the problem: long lines get truncated by the R-readline interface and so the next line is appended to part of the previous line (without the closing " in this case).
It works from redirected input because the first chunk is syntactically incomplete (and --no-readline has no affect unless input is from a tty). BTW, 'file redirection' seems incorrect: no file is told to go elsewhere! OTOH, input is redirected to come from the file. On Fri, 25 Aug 2006, Jeffrey Horner wrote: > Prof Brian Ripley wrote: > > I've been trying to track down some of the issues with command line length > > limits, and those writing GUIs/front-ends need to pay some attention to the > > issue. > > > > src/unix/system.txt says > > > > * int R_ReadConsole(char *prompt, char *buf, int buflen, int hist) > > * > > * This function prints the given prompt at the console and then > > * does a gets(3)-like operation, transferring up to "buflen" characters > > * into the buffer "buf". The last two characters are set to "\n\0" > > * to preserve sanity. > > > > but that isn't actually true for some of the standard interfaces and seems > > undesirable. (Also, for 'characters' read 'bytes'.) > > > > What happens is that all calls to R_ReadConsole have buflen=1024. (These > > can be an input line of R code, or from scan() or from a stdin() > > connection.) If this is command input, the result is parsed, and if > > incomplete and not an error, more input is requested until it is complete. > > > > Suppose the user entered a very long line. Should the first 1024 bytes be > > syntactically complete, this will not do what he expected and it will be as > > if a LF had been inserted after 1024 bytes. But that is unlikely, and he > > may well get away with it, unless R_ReadConsole did actually does as > > documented and inserts "\n\0" (the Rgui and readline consoles do, but > > reading from a file in Linux or Windows does not). > > > > It seems the correct advice is that R_ReadConsole should only send a "\n" > > when there is no more input available, e.g. on EOF. I am changing the > > calling code to have a 1025 char buffer with last '\0' to ensure > > null-termination. > > > > Some consoles try to ensure that the user cannot enter more than 1024 bytes. > > That's a bit awkward in a MBCS, and also when input is being pasted in > > (possibly in the middle of a line). Generally this does not work too well: > > e.g. the readline console truncates at 1022 chars and appends a \n. > > > > I have no idea how an R user was expected to know there was a line limit. > > I've added some documentation to R-intro (but I will need to correct it as I > > didn't know the readline console used 1022). The limit applies to > > redirected input from a file, but not to source(). > > Just thought I'd throw a test case at you. If I run the following code: > > longline <- function(len){ > n <- floor(len/10) > m = len %% 10 > if (m>0){ > x <- paste(rep(seq(0,9),n),collapse='') > y <- paste(seq(0,m-1),collapse='') > z <- paste(x,y,sep='') > } else { > z <- paste(rep(seq(0,9),n),collapse='') > } > z > } > cat("x<-\"", longline(1020), "\";",sep=""); > cat("cat(x,\"\\n\"",")\n",sep=""); > cat("cat(nchar(x),\"\\n\"",")\n",sep=""); > > and save the output in test_longout.R, it behaves correctly (on linux R-2.3.1 > built with readline support) with file redirection (is this what you mean by > redirected input from a file?): > > R --vanilla < ./test_longline.R > > with or without --no-readline. Now, if I start R manually and then paste the > output of test_longline.R into the console, I get undesired behavior: > > Error: syntax error in "cat(nchar(x),"\" > > but if I start R without readline and paste, no problem. > > Jeff > -- Brian D. Ripley, [EMAIL PROTECTED] Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel