[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