From hb at maths.lth.se  Tue Jul 19 09:16:05 2005
From: hb at maths.lth.se (Henrik Bengtsson)
Date: Tue, 19 Jul 2005 09:16:05 +0200
Subject: [Rd] Minor "bug" in source()
Message-ID: <42DCA8B5.2000808@maths.lth.se>

For R v2.1.1 patched and R v2.2.0 devel:

Calling source(file, chdir=TRUE) with is.character(file) != TRUE, that 
is, with 'file' as a connection, will generate an error. Example:

 > file <- textConnection("cat('Hello world\n')")
 > source(file, chdir=TRUE)
Error in source(file, chdir = TRUE) : Object "ofile" not found

Of course, it does not make sense to change working directory, but 
quietly ignoring 'chdir' is better, I think.

This is due to a simple coding mistake in source() [sorry, 56k modem
=> no R source => no diff]:

<snip></snip>
     if (is.character(file)) {
         ofile <- file
         if (capabilities("iconv")) {
             if (identical(encoding, "unknown")) {
         <snip></snip>
     }
     Ne <- length(exprs <- .Internal(parse(file, n = -1, NULL,
         "?")))
     if (verbose)
         cat("--> parsed", Ne, "expressions; now eval(.)ing them:\n")
     if (Ne == 0)
         return(invisible())
     if (chdir && is.character(ofile)) {        <=== HERE
         isURL <- length(grep("^(ftp|http|file)://", ofile)) >
             0
         if (!isURL && (path <- dirname(ofile)) != ".") {
             owd <- getwd()
             on.exit(setwd(owd), add = TRUE)
             setwd(path)
         }
     }
<snip></snip>

I suggest to either i) do 'ofile <- file' before the first if-clause 
above, or better ii) move the last if-clause inside the first one (and 
remove " && is.character(ofile)").

Best

Henrik



[Rd] Minor "bug" in source()
Henrik Bengtsson