如何检查 `R6` class 的实例是否存在于 class 实例的向量中

How to check if instance of `R6` class is present in a vector of class instances

我正在寻找一种方法来检查 R6 class 的给定实例是否存在于 R6 class 个实例的向量中。

library(R6)

# define a class
Person <- R6Class("Person", list(
  name = NULL,
  initialize = function(name) self$name <- name
))

# create two instances of a class
Jack <- Person$new(name = "Jack")
Jill <- Person$new(name = "Jill")

我天真地使用%in%来检查这个,它似乎有效:

# yes
c(Jack) %in% c(Jack, Jill)
#> [1] TRUE

但实际上 returns TRUE 无论实例如何:

# also yes
c(Jack) %in% c(Jill)
#> [1] TRUE

所以我有两个问题:

  1. 什么是 %in% 实际上匹配它总是 returns TRUE
  2. 如何正确检查 R6 class 的实例是否存在于 class 个实例的向量中?

R6 对象是环境,c(Jack) 是一个包含环境的列表,%in% 在环境列表上的行为类似。

e1 <- new.env()
e2 <- new.env()
list(e1) %in% list(e2)
## [1] TRUE

尝试identical

sapply(c(Jack , Jill), identical, Jack)
## [1]  TRUE FALSE

R6 对象在它们的 class 向量中有 "R6" 所以

sapply(c(Jack, Jill, sin, 37), inherits, "R6")
## [1]  TRUE  TRUE FALSE FALSE