[R] detecting if a variable has changed

(Ted Harding) Ted.Harding at wlandres.net
Sun Jun 5 21:49:15 CEST 2016


Ah, perhaps I'm beginning to undertstand the question!
Presumably the issue is that evaluating X[X<=y] takes O(n) time,
where n = length(X), and similarly X[X>y]. 

So I suppose that one needs to be looking at some procedure for
a "bisecting" search for the largest r such that X[r] <= y, which
would then be O(log2(n)).

Perhaps not altogether straightforward to program, but straqightforward
in concept!

Apologies for misunderstanding.
Ted.

On 05-Jun-2016 18:13:15 Bert Gunter wrote:
> Nope, Ted. I asked for  a O(log(n)) solution, not an O(n) one.
> 
> I will check out the data.table package, as suggested.
> 
> -- Bert
> Bert Gunter
> 
> "The trouble with having an open mind is that people keep coming along
> and sticking things into it."
> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
> 
> 
> On Sun, Jun 5, 2016 at 11:01 AM, Ted Harding <Ted.Harding at wlandres.net>
> wrote:
>> Surely it is straightforward, since the vector (say 'X') is already sorted?
>>
>> Example (raw code with explicit example):
>>
>> set.seed(54321)
>> X <- sort(runif(10))
>> # X ## The initial sorted vector
>> # [1] 0.04941009 0.17669234 0.20913493 0.21651016 0.27439354
>> # [6] 0.34161241 0.37165878 0.42900782 0.49843042 0.86636110
>>
>> y <- runif(1)
>> # y ## The new value to be inserted
>> [1] 0.1366424
>>
>> Y <- c(X[X<=y],y,X[X>y]) ## Now insert y into X:
>> Y
>> [1] 0.04941009 0.13664239 0.17669234 0.20913493 0.21651016 0.27439354
>> [7] 0.34161241 0.37165878 0.42900782 0.49843042 0.86636110
>>
>> ## And there it is at Y[2]
>>
>> Easy to make such a function!
>> Best wishes to all,
>> Ted.
>>
>> On 05-Jun-2016 17:44:29 Neal H. Walfield wrote:
>>> On Sun, 05 Jun 2016 19:34:38 +0200,
>>> Bert Gunter wrote:
>>>> This help thread suggested a question to me:
>>>>
>>>> Is there a function in some package that efficiently (I.e. O(log(n)) )
>>>> inserts a single new element into the correct location in an
>>>> already-sorted vector? My assumption here is that doing it via sort()
>>>> is inefficient, but maybe that is incorrect. Please correct me if so.
>>>
>>> I think data.table will do this if the the column is marked
>>> appropriately.
>>>
>>>> I realize that it would be straightforward to write such a function,
>>>> but I just wondered if it already exists. My google & rseek searches
>>>> did not succeed, but maybe I used the wrong keywords.
>>>>
>>>> Cheers,
>>>> Bert
>>>>
>>>>
>>>> Bert Gunter
>>>>
>>>> "The trouble with having an open mind is that people keep coming along
>>>> and sticking things into it."
>>>> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>>>>
>>>>
>>>> On Sun, Jun 5, 2016 at 9:47 AM, William Dunlap via R-help
>>>> <r-help at r-project.org> wrote:
>>>> > 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.
>>>> >>
>>>> >
>>>> >         [[alternative HTML version deleted]]
>>>> >
>>>> > ______________________________________________
>>>> > 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.
>>>>
>>>
>>> ______________________________________________
>>> 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.
>>
>> -------------------------------------------------
>> E-Mail: (Ted Harding) <Ted.Harding at wlandres.net>
>> Date: 05-Jun-2016  Time: 19:01:10
>> This message was sent by XFMail
>> -------------------------------------------------
> 
> ______________________________________________
> 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.

-------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at wlandres.net>
Date: 05-Jun-2016  Time: 20:49:12
This message was sent by XFMail



More information about the R-help mailing list