метод as.list, который работает с Reduce - PullRequest
0 голосов
/ 23 мая 2018

Я создал собственный класс S4, который поддерживает список объектов.Я хочу иметь возможность использовать Reduce в списке, содержащемся в этом классе S4, однако, когда я реализую метод as.list, функция не отправляет должным образом из Reduce.Вот простой пример:

myClass <- setClass("myClass", slots=c(data="list"))

setMethod("as.list", "myClass", function(x, ...) x@data)

items <- myClass(data=list(1, 2, 3, 4, 5))

> Reduce(`+`, items@data)
[1] 15 

> Reduce(`+`, as.list(items))
[1] 15

> Reduce(`+`, items) ## fails
Error in as.list.default(x) : no method for coercing this S4 class to a vector

Как я могу направить R для отправки на мой пользовательский класс при вызове as.list из Reduce?

as.list используется в теле Reduce, и он даже имеет видимость моего метода, однако он использует as.list.default и не отправляет должным образом.

> Reduce
function (f, x, init, right = FALSE, accumulate = FALSE) 
{
    mis <- missing(init)
    len <- length(x)
    if (len == 0L) 
        return(if (mis) NULL else init)
    f <- match.fun(f)
    if (!is.vector(x) || is.object(x)) 
        x <- as.list(x)
...

Отредактировано для добавления информации о версии:

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7600)
...