Usage
## S3 method for class 'default}(file, chdir=FALSE, ..., local=TRUE, envir=parent.frame())':
sourceToundefined
 Parses and evaluates code from a file or a connection.
   This has the same effect as if source(..., local=TRUE) would have
   been called from within the given environment.
   This is useful when setting up a new local working environment.
 - file{A
connection or a character string giving the pathname
         of the file or URL to read from.}
   - chdir{If
TRUE and file is a pathname, the Rworking directory is temporarily changed to the directory
         containing file for evaluating.}
   - ...{Arguments to
source(). If argument file is
      not explicitly given, the first argument is assumed to be the
      file argument. This argument is converted into a string by
      as.character().
   }
   - local{If
FALSE, evaluation is done in the global environment,
      otherwise in the calling environment.}
   - envir{An
environment in which source() should be
      called. If NULL, the global environment is used.}
 Return the result of source().
 {
  This methods recognizes the hook sourceTo/onPreprocess, which
  is called after the lines in file has been read, but before they have
  been parsed by the Rparser, cf. parse().
  An onPreprocess hook function should take a character vector
  of code lines and return a character vector of code lines.
  This can for instance be used to pre-process R source code with special
  directives such as VComments.
  Note that only one hook function can be used for this function, otherwise
  an error is generated.
 }
 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Example 1
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat("=== Example 1 ================================================
")
foo <- function(file, ...) {
  cat("Local objects before calling sourceTo():
")
  print(ls())
  res <- sourceTo(file, ...)
  cat("Local objects after calling sourceTo():
")
  print(ls())
}
cat("Global objects before calling foo():
")
lsBefore <- NA
lsBefore <- ls()
foo(file=textConnection(c('a <- 1', 'b <- 2')))
cat("Global objects after calling foo():
")
stopifnot(length(setdiff(ls(), lsBefore)) == 0)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Example 2 - with VComments preprocessor
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat("=== Example 2 ================================================
")
preprocessor <- function(lines, ...) {
  cat("-----------------------------------------
")
  cat("Source code before preprocessing:
")
  displayCode(code=lines, pager="console")
  cat("-----------------------------------------
")
  cat("Source code after preprocessing:
")
  lines <- VComments$compile(lines)
  displayCode(code=lines, pager="console")
  cat("-----------------------------------------
")
  lines
}
oldHooks <- getHook("sourceTo/onPreprocess")
setHook("sourceTo/onPreprocess", preprocessor, action="replace")
code <- c(
 'x <- 2',
 '#V1# threshold=-1',
 '#Vc# A v-comment log message',
 'print("Hello world")'
)
fh <- textConnection(code)
sourceTo(fh)
setHook("sourceTo/onPreprocess", oldHooks, action="replace")
 [object Object]
 sourceDirectory().
  Compare to source().
programming
IO