| refset {refset} | R Documentation |
Create a reference to a subset of an object
Description
Create a refset - a reference to a subset of an object. When the object changes, the contents of the refset change, and when the refset is changed, the object is changed too.
Usage
refset(x, data, ..., drop = TRUE, dyn.idx = TRUE, read.only = FALSE,
eval.env = parent.frame(), assign.env = parent.frame())
x %r% data
Arguments
x |
name of the refset to create, as a bare name or character string |
data |
the object to refer to |
... |
indices to subset with |
drop |
passed to |
dyn.idx |
update indices dynamically |
read.only |
create a read-only refset which throws an error if assigned to |
eval.env |
environment in which |
assign.env |
environment in which the variable named by |
Details
There are two ways to call refset. The two-argument form, e.g.
refset(myref, mydata[rows,"column"]), creates a reference to the
subset of mydata passed in the second argument.
The three-or-more argument form acts like the subset function:
the indices in ... are applied to data. If data is a
data.frame, then the indices are interpreted within it, so you can refer to
columns directly: refset(myref, mydata, a>1 & b<a,). Bare column names
must be quoted, however.
Empty arguments in ... are allowed and are treated as indexing
the whole dimension, just as in Extract.
By default, the indices in subset are updated dynamically.
For example, if you call refset(myref, mydata, x >= 3,) and then
set mydata$x <- 3, the number of rows in myref will probably
increase. To turn this behaviour off and make a reference to a "fixed"
subset of your object, use dyn.idx=FALSE.
%r% is an infix version of the two-argument form.
Value
refset returns NULL, but the x argument
will be assigned to
in the calling environment (or in env, if it is specified).
x will have an attribute ".refset.".
See Also
Refsets are implemented using makeActiveBinding.
Examples
dfr <- data.frame(a=1:4, b=1:4)
ss <- dfr[1:2,]
refset(rs, dfr[1:2,])
dfr$a <- 4:1
ss # 1:2
rs # 4:3
# same:
refset(rs, dfr, 1:2, )
# same:
rs %r% dfr[1:2,]
vec <- 1:10
refset(middle, vec[4:6])
vec[4:6] <- NA
middle
middle <- 4:6 + 100
vec
# dynamic versus static indices:
dfr <- data.frame(a=rnorm(100), b=rnorm(100))
refset(ss, dfr, a>1,)
refset(ss.static, dfr, a>1,, dyn.idx=FALSE)
nrow(ss) == nrow(ss.static)
dfr$a <- dfr$a + 2 * dfr$b
precious.data <- rnorm(100)
refset(big, precious.data, precious.data>1, read.only=TRUE)
big
## Not run:
big <- big * 2 # throws an error
## End(Not run)
# Using refset with other functions:
# dynamically updated calculated column
dfr <- data.frame(a=rnorm(10), b=rnorm(10))
refset(rs, transform(dfr, x=a+2*b+rnorm(10)))
rs
rs # different
# Non-readonly refset with other functions. Works but gives a warning:
## Not run:
vec <- 1:5
refset(ssv, names(vec), read.only=FALSE)
ssv <- LETTERS[1:5]
vec
## End(Not run)