There are two approaches to read external code into the current session: (1) Use a special separator
of the from ## ---- chunk-label (at least four dashes before the chunk label) in the script; (2)
Manually specify the labels, starting and ending positions of code chunks in the script.
Thesecond approachwill beusedonly whenlabelsis notNULL. For this approach, if fromis NULL,
the starting position is 1; if to is NULL, each of its element takes the next element of from minus 1,
and the lastelementof towill bethe length of lines (e.g. when from = c(1, 3, 8)andthe script
has 10 lines in total, to will be c(2, 7, 10)). Alternatively, from and to can be character vectors
as regular expressions to specify the positions; when their length is 1, the single regular expression
will be matched against the lines vector, otherwise each element of from/to is matched against
lines and the match is supposed to be unique so that the numeric positions returned from grep()
will be of the same length of from/to. Note labels always has to matchthe length of from and to.
As a side effect, code chunks are read into the current session so that future chunks can (re)use the
code by chunk label references.
This function can onlybe used in a chunk whichis not cached (chunk option cache = FALSE), and
the code is read and stored in the current session without being executed (to actually run the code,
you have to use a chunk with a corresponding label).
YihuiXie; theidea of thesecondapproachcamefrom Peter Ruckdeschel(author oftheSweaveListingUtils
## put this in foo.R and read_chunk(foo.R)
## ---- my-label ----
1 + 1
lm(y ~ x, data = data.frame(x = 1:10, y = rnorm(10)))
## later you can use <<my-label>>= to reference this chunk
## the 2nd approach
code = c("#@a", "1+1", "#@b", "#@a", "rnorm(10)", "#@b")
read_chunk(lines = code, labels = "foo") # put all code into one chunk named foo
read_chunk(lines = code, labels = "foo", from = 2, to = 2) # line 2 into chunk foo
read_chunk(lines = code, labels = c("foo", "bar"), from = c(1, 4), to = c(3, 6))
# automatically figure out to
read_chunk(lines = code, labels = c("foo", "bar"), from = c(1, 4))
read_chunk(lines = code, labels = c("foo", "bar"), from = "^#@a", to = "^#@b")
read_chunk(lines = code, labels = c("foo", "bar"), from = "^#@a", to = "^#@b",
from.offset = 1, to.offset = -1)