[Rd] Command line length limits in R

Jeffrey Horner jeff.horner at vanderbilt.edu
Fri Aug 25 19:27:23 CEST 2006


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
-- 
http://biostat.mc.vanderbilt.edu/JeffreyHorner



More information about the R-devel mailing list