Способ сделать это без использования явной индексации - использовать sapply(contentList, identical, content)
для поиска подходящего объекта. Мы можем упростить все ваше определение класса, сохранив функциональность, например:
Element <- setRefClass(
Class = "Element",
fields = list(m_name = "character", contentList = "list"),
methods = list(initialize = function(name = NULL)
{
if (!is.null(name)) m_name <<- name
},
addContent = function(content)
{
contentList <<- append(contentList, content)
},
removeContent = function(content)
{
idx <- sapply(contentList, identical, content)
if (all(!idx)) stop("Content not found")
contentList <<- contentList[!idx]
})
)
Теперь мы можем проверить его на ваших примерах:
foo <- Element$new("foo")
foo$addContent(Element$new("Bar"))
baz <- Element$new("Baz")
foo$addContent(baz)
foo
#> Reference class object of class "Element"
#> Field "m_name":
#> [1] "foo"
#> Field "contentList":
#> [[1]]
#> Reference class object of class "Element"
#> Field "m_name":
#> [1] "Bar"
#> Field "contentList":
#> list()
#>
#> [[2]]
#> Reference class object of class "Element"
#> Field "m_name":
#> [1] "Baz"
#> Field "contentList":
#> list()
foo$removeContent(baz)
foo
#> Reference class object of class "Element"
#> Field "m_name":
#> [1] "foo"
#> Field "contentList":
#> [[1]]
#> Reference class object of class "Element"
#> Field "m_name":
#> [1] "Bar"
#> Field "contentList":
#> list()
и с вашим tryCatch
:
tryCatch(
{
foo$removeContent(baz)
},
error=function(cond) {
print(paste("Expected this error, ", cond$message))
}
)
#> [1] "Expected this error, Content not found"
Создано в 2020-04-08 пакетом Представить (v0.3.0)