Are these any different from each other? Assume x is defined:
inherits(x,"data.frame")
"data.frame" %in% class(x)
Also, it need not be "data.frame". It can be something else like "workflow". I just want to know as these seem to do the same thing (i.e. check if x is a data frame), but I feel like they might be different.
CodePudding user response:
The main difference is in vectorized class checking, for example if you want to check whether an object belongs to one of a number of different classes. Then inherits will return a length-one logical vector, whereas %in% returns multiple results (one for each test class)
df <- data.frame(a = 1:3)
inherits(df, c("data.frame", "foo"))
#> [1] TRUE
c("data.frame", "foo") %in% class(df)
#> [1] TRUE FALSE
This could be relevant when using a logical test of class type. For example, suppose I want to check that df is either a data frame or of class foo. I can safely put inherits inside an if statement:
if(inherits(df, c("data.frame", "foo"))) {
cat("Object df is either a data frame or a foo")
}
#> Object df is either a data frame or a foo
But I will get an error if I do the same thing with %in%
if(c("data.frame", "foo") %in% class(df)) {
cat("Object df is either a data frame or a foo")
}
#> Error in if (c("data.frame", "foo") %in% class(df)) {
#> : the condition has length > 1
If you only want to check for a single class, the two are essentially equivalent, or in the case of tests for multiple classes, wrapping the %in% with any will achieve the same effect.
Created on 2022-06-15 by the reprex package (v2.0.1)
