sourceTo.Rd
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.
# S3 method for default
sourceTo(file, path=NULL, chdir=FALSE, ..., local=TRUE, envir=parent.frame(),
modifiedOnly=FALSE)
A connection
or a character
string giving the pathname
of the file or URL to read from.
An optional character
string giving the path to the file.
Ignored if file
is a connection.
If TRUE
and file
is a pathname, the R
working 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()
.
If FALSE
, evaluation is done in the global environment,
otherwise in the calling environment.
An environment
in which source
() should be
called. If NULL
, the global environment is used.
If TRUE
, the file is sourced only if modified
since the last time it was sourced, otherwise regardless.
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 R parser, 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.
sourceDirectory
().
sys.source
() and source
().
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Example 1
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat("=== Example 1 ================================================\n")
#> === Example 1 ================================================
foo <- function(file, ...) {
cat("Local objects before calling sourceTo():\n")
print(ls())
res <- sourceTo(file, ...)
cat("Local objects after calling sourceTo():\n")
print(ls())
}
cat("Global objects before calling foo():\n")
#> Global objects before calling foo():
lsBefore <- NA
lsBefore <- ls()
foo(file=textConnection(c('a <- 1', 'b <- 2')))
#> Local objects before calling sourceTo():
#> [1] "file"
#> Local objects after calling sourceTo():
#> [1] "a" "b" "file" "res"
cat("Global objects after calling foo():\n")
#> Global objects after calling foo():
stopifnot(length(setdiff(ls(), lsBefore)) == 0)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Example 2 - with VComments preprocessor
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cat("=== Example 2 ================================================\n")
#> === Example 2 ================================================
preprocessor <- function(lines, ...) {
cat("-----------------------------------------\n")
cat("Source code before preprocessing:\n")
displayCode(code=lines, pager="console")
cat("-----------------------------------------\n")
cat("Source code after preprocessing:\n")
lines <- VComments$compile(lines)
displayCode(code=lines, pager="console")
cat("-----------------------------------------\n")
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)
#> -----------------------------------------
#> Source code before preprocessing:
#> Warning: error in running command
#> -----------------------------------------
#> Source code after preprocessing:
#> Warning: error in running command
#> -----------------------------------------
#> [1] "Hello world"
setHook("sourceTo/onPreprocess", oldHooks, action="replace")