[R] detecting if a variable has changed
Neal H. Walfield
neal at walfield.org
Sun Jun 5 18:51:03 CEST 2016
Hi,
This looks more or less what I'm looking for! Thanks!
:) Neal
On Sun, 05 Jun 2016 18:47:11 +0200,
William Dunlap wrote:
>
> [1 <text/plain; UTF-8 (7bit)>]
> [2 <text/html; UTF-8 (quoted-printable)>]
> I don't know what you mean by "without having to use any special
> interfaces", but "reference classes" will do what I think you want.
> E.g., the following makes a class called 'SortedNumeric' that only
> sorts the vector when you want to get its value, not when you append
> values. It stores the sorted vector so it does not get resorted each
> time you ask for it.
>
> SortedNumeric <- setRefClass("sortedNumeric",
> fields = list(
> fData = "numeric",
> fIsUnsorted = "logical"),
> methods = list(
> initialize = function(Data = numeric(), isUnsorted = TRUE) {
> fData <<- Data
> stopifnot(is.logical(isUnsorted),
> length(isUnsorted)==1,
> !is.na(isUnsorted))
> fIsUnsorted <<- isUnsorted
> },
> getData = function() {
> if (isUnsorted) {
> fData <<- sort(fData)
> fIsUnsorted <<- FALSE
> }
> fData
> },
> appendData = function(newEntries) {
> fData <<- c(fData, newEntries)
> fIsUnsorted <<- TRUE
> }
> ))
>
> Use it as:
>
>
>
> > x <- SortedNumeric$new()
>
>
> > x$appendData(c(4,2,5))
>
>
> > x$appendData(c(1,8,9))
>
>
> > x
>
>
> Reference class object of class "sortedNumeric"
>
>
> Field "fData":
>
>
> [1] 4 2 5 1 8 9
>
>
> Field "fIsUnsorted":
>
>
> [1] TRUE
>
>
> > x$getData()
>
>
> [1] 1 2 4 5 8 9
>
>
> > x
>
>
> Reference class object of class "sortedNumeric"
>
>
> Field "fData":
>
>
> [1] 1 2 4 5 8 9
>
>
> Field "fIsUnsorted":
>
>
> [1] FALSE
>
> Outside of base R, I think the R6 package gives another approach to
> this.
>
> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com
>
> On Sun, Jun 5, 2016 at 6:53 AM, Neal H. Walfield <neal at walfield.org>
> wrote:
>
> Hi,
>
> I have a huge list. Normally it is sorted, but I want to be able
> to
> add elements to it without having to use any special interfaces
> and
> then sort it on demand. My idea is to use something like weak
> references combined with attributes. Consider:
>
> # Initialization.
> l = as.list(1:10)
> # Note that it is sorted.
> attr(l, 'sorted') = weakref(l)
>
> # Modify the list.
> l = append(l, 1:3)
>
> # Check if the list is still sorted. (I use identical here, but it
> # probably too heavy weight: I just need to compare the
> addresses.)
> if (! identical(l, attr(l, 'sorted'))) {
> l = sort(unlist(l))
> attr(l, 'sorted') = weakref(l)
> }
> # Do operation that requires sorted list.
> ...
>
> This is obviously a toy example. I'm not actually sorting integers
> and I may use a matrix instead of a list.
>
> I've read:
>
> http://www.hep.by/gnu/r-patched/r-exts/R-exts_122.html
> http://homepage.stat.uiowa.edu/~luke/R/references/weakfinex.html
>
> As far as I can tell, weakrefs are only available via the C API.
> Is
> there a way to do what I want in R without resorting to C code? Is
> what I want to do better achieved using something other than
> weakrefs?
>
> Thanks!
>
> :) Neal
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
>
More information about the R-help
mailing list