From maechler at stat.math.ethz.ch  Fri Jul  2 12:22:07 2010
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Fri, 2 Jul 2010 12:22:07 +0200
Subject: [Rd] POSIXlt matching bug
In-Reply-To: <EEBC169715EB8C438D3C9283AF0F201C08A7C74E@MSGBOSCLM2WIN.DMN1.FMR.COM>
References: <EEBC169715EB8C438D3C9283AF0F201C08A7C74E@MSGBOSCLM2WIN.DMN1.FMR.COM>
Message-ID: <19501.48591.423818.616581@lynne.math.ethz.ch>

>>>>> "RobMcG" == McGehee, Robert <Robert.McGehee at geodecapital.com>
>>>>>     on Tue, 29 Jun 2010 10:46:06 -0400 writes:

    RobMcG> I came across the below mis-feature/bug using match with POSIXlt objects
    RobMcG> (from strptime) in R 2.11.1 (though this appears to be an old issue).

    >> x <- as.POSIXlt(Sys.Date())
    >> table <- as.POSIXlt(Sys.Date()+0:5)
    >> length(x)
    RobMcG> [1] 1
    >> x %in% table  # I expect TRUE
    RobMcG> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    >> match(x, table) # I expect 1
    RobMcG> [1] NA NA NA NA NA NA NA NA NA

    RobMcG> This behavior seemed more plausible when the length of a POSIXlt object
    RobMcG> was 9 (back in the day), however since the length was redefined, the
    RobMcG> length of x no longer matches the length of the match function output,
    RobMcG> as specified by the ?match documentation: "A vector of the same length
    RobMcG> as 'x'".

    RobMcG> I would normally suggest that we add a POSIXlt method for match that
    RobMcG> converts x into POSIXct or character first. However, match does not
    RobMcG> appear to be generic. Below is a possible rewrite of match that appears
    RobMcG> to work as desired.

    RobMcG> match <- function(x, table, nomatch = NA_integer_, incomparables = NULL)

    RobMcG> .Internal(match(if(is.factor(x)||inherits(x, "POSIXlt"))
    RobMcG> as.character(x) else x,
    RobMcG> if(is.factor(table)||inherits(table, "POSIXlt"))
    RobMcG> as.character(table) else table,
    RobMcG> nomatch, incomparables))

    RobMcG> That said, I understand some people may be very sensitive to the speed
    RobMcG> of the match function, 

yes, indeed. 

I'm currently investigating an alternative, considerably more
programming time, but in the end should loose much less speed,
is to  .Internal()ize the tests in C code,
so that the resulting R code would simply be

match <- function(x, table, nomatch = NA_integer_, incomparables = NULL)
        .Internal(x, table, nomatch, incomparables)


Martin Maechler,
ETH Zurich


    RobMcG> and may prefer a simple change to the ?match
    RobMcG> documentation noting this (odd) behavior for POSIXlt. 

    RobMcG> Thanks, Robert

    RobMcG> R.version
    RobMcG> _                            
    RobMcG> platform       x86_64-unknown-linux-gnu     
    RobMcG> arch           x86_64                       
    RobMcG> os             linux-gnu                    
    RobMcG> system         x86_64, linux-gnu            
    RobMcG> status                                      
    RobMcG> major          2                            
    RobMcG> minor          11.1                         
    RobMcG> year           2010                         
    RobMcG> month          05                           
    RobMcG> day            31                           
    RobMcG> svn rev        52157                        
    RobMcG> language       R                            
    RobMcG> version.string R version 2.11.1 (2010-05-31)

    RobMcG> Robert McGehee, CFA
    RobMcG> Geode Capital Management, LLC
    RobMcG> One Post Office Square, 28th Floor | Boston, MA | 02109
    RobMcG> Tel: 617/392-8396    Fax:617/476-6389
    RobMcG> mailto:robert.mcgehee at geodecapital.com


    >> This e-mail, and any attachments hereto, are intended for use by the
    RobMcG> addressee(s) only and may contain information that is (i) confidential
    RobMcG> information of Geode Capital Management, LLC and/or its affiliates,
    RobMcG> and/or (ii) proprietary information of Geode Capital Management, LLC
    RobMcG> and/or its affiliates. If you are not the intended recipient of this
    RobMcG> e-mail, or if you have otherwise received this e-mail in error, please
    RobMcG> immediately notify me by telephone (you may call collect), or by e-mail,
    RobMcG> and please permanently delete the original, any print outs and any
    RobMcG> copies of the foregoing. Any dissemination, distribution or copying of
    RobMcG> this e-mail is strictly prohibited. 

    RobMcG> ______________________________________________
    RobMcG> R-devel at r-project.org mailing list
    RobMcG> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] POSIXlt matching bug
Martin Maechler