Skip to content

Segfault with match()

5 messages · William Dunlap, Hadley Wickham, Luke Tierney

#
This is admittedly a contrived example, but...

data(housing, package ="MASS")
x <- housing$Type + housing$Sat
match(x, unique(x))

Hadley
#
Did you leave out the warning from "+", which should be an error,
as it produces an illegal ordered factor in this case and factor+factor
is nonsensical?  Or is the warning missing in the current development
version of R?
Warning message:
Incompatible methods ("Ops.factor", "Ops.ordered") for "+"
ordered[1:2] w/ 2 levels B<C:  2 3


Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Mon, Mar 30, 2015 at 1:10 PM, Hadley Wickham <h.wickham at gmail.com> wrote:

            

  
  
#
For consistency with factor+factor and factor+numeric, factor+ordered
should produce a logical vector filled with NAs, not throw an error.

Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Mon, Mar 30, 2015 at 1:50 PM, William Dunlap <wdunlap at tibco.com> wrote:

            

  
  
#
I left out the warning - it's still there. The output object is
malformed but either +.factor should prevent this or match() should
check.

Hadley
On Mon, Mar 30, 2015 at 3:50 PM, William Dunlap <wdunlap at tibco.com> wrote:

  
    
#
The segfault was occurring in Rf_asCharacterFactor, which was using
the levels attribute without sanity checks. Sanity checks are now
added (r68119 in trunk and r68120. in R-3-2-branch), which now gives
Warning message:
Incompatible methods ("Ops.factor", "Ops.ordered") for "+"
Error in match(x, unique(x)) : malformed factor

I'll leave it to others to figure out how not to get the malformed
factor in the first place (but as a user could intentionally create
one we need the sanity checks anyway).

Best,

luke
On Mon, 30 Mar 2015, Hadley Wickham wrote: