[Rd] model.frame strips class as promised, but fails to strip OBJECT in C
Michael Chirico
michaelchirico4 at gmail.com
Mon Mar 5 16:59:03 CET 2018
Full thread here:
https://github.com/tidyverse/broom/issues/287
Reproducible example:
is.object(freeny$y)
# [1] TRUE
attr(freeny$y, 'class')
# [1] "ts"
class(freeny$y)
# [1] "ts"
# ts attribute wiped by model.frame
class(model.frame(y ~ ., data = freeny)$y)
# [1] "numeric"
attr(model.frame(y ~ ., data = freeny)$y, 'class')
# NULL
# but still:
is.object(model.frame(y ~ ., data = freeny)$y)
# [1] TRUE
That is, given a numeric vector with class "ts", model.frame strips the
"ts" attribute but keeps the is.object property.
This behavior is alluded to in ?model.frame:
Unless na.action = NULL, time-series attributes will be removed from the
> variables found (since they will be wrong if NAs are removed).
>
And in fact explicitly setting na.action = NULL prevents dropping the class:
class(model.frame(y ~ ., data = freeny, na.action = NULL)$y)
# [1] "ts"
The reason this looks especially like a bug is that it differs from how
na.omit behaves:
DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA))
is.object(DF$y)
# [1] FALSE
class(DF$y) = 'foo'
is.object(DF$y)
# [1] TRUE
class(na.omit(DF)$y)
# [1] "numeric"
is.object(na.omit(DF)$y)
# [1] FALSE
That is, similarly presented with a classed object, na.omit strips the
class *and* the OBJECT attribute.
Thanks,
Michael Chirico
[[alternative HTML version deleted]]
More information about the R-devel
mailing list