Понимание базы :: идентично () — почему это «безопаснее»?

#r

#r

Вопрос:

Я всегда слышал, что identical() это «безопаснее», чем == . Но, играя с ними обоими, кажется, что желаемый результат достигается последним, а не первым. Я предполагаю, что это как-то связано с атрибутами объекта, сгенерированного nrow() , но было бы неплохо уточнить, почему это происходит в примере ниже:

 > identical(3653510 2751069, 6404579)
[1] TRUE
> identical((3653510 nrow(df)), nrow(df2))
[1] FALSE
> nrow(df)
[1] 2751069
> nrow(df2)
[1] 6404579
> nrow(df2)-nrow(df)
[1] 3653510
> (3653510 nrow(df))==nrow(df2)
[1] TRUE
  

Итак, подводя итог, у меня есть два вопроса:

  1. Что происходит с identical() ?
  2. Что мы имеем в виду, говоря, что функция «безопаснее» для использования в этом контексте?

Комментарии:

1. Попробуйте использовать all.equal . identical также проверяет атрибуты

2. … так что, вероятно, разница между numeric и int , т. е. class(3653510 2751069); class(6404579); class(3653510 nrow(df)); class(nrow(df2))

Ответ №1:

Это может быть разница в атрибутах. например

 n1 <- 2751069
n2 <- 6404579
identical((3653510   n1), n2)
#[1] TRUE
  

Оба являются числовым классом. Если мы изменим одно из них на integer , оно вернет FALSE

 n2 <- 6404579L
identical((3653510   n1), n2)
#[1] FALSE
  

С помощью all.equal мы также можем указать check.attributes = FALSE

 all.equal((3653510   n1), n2, check.attributes = FALSE)
#[1] TRUE