Я создал собственный класс 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)