Принудительное применение для возврата списка

У меня есть матрица и функция, которая берет вектор и возвращает матрицу. Я хочу применить функцию ко всем строкам матрицы и объединить все результаты. Например

mat <- matrix(1:6, ncol=2)
f <- function (x) cbind(1:sum(x), sum(x):1)
do.call(rbind, apply(mat, 1, f))

Это отлично работает, поскольку возвращаемые матрицы имеют разные числа строк, поэтому apply возвращает список. Но если они имеют одинаковое количество строк, это больше не работает:

mat <- f(3)
apply(mat, 1, f)

apply возвращает матрицу, из которой я не могу получить результат, который я хочу. Можно ли принудительно применить заявку для возврата списка или есть другое решение?

Ответ 1

Вы должны разбить матричный мат перед применением функции f.

list_result <- lapply(split(mat,seq(NROW(mat))),f)
matrix_result <- do.call(rbind,list_result)

Ответ 2

Вот почему я люблю пакет plyr. Он имеет ряд функций --ply, которые работают одинаково. Первая буква соответствует тому, что у вас есть в качестве ввода, а второй метод соответствует тому, что у вас есть в качестве вывода (l для списков, a для массивов, d для фреймов данных).

Итак, функция alply() работает аналогично apply(), но всегда возвращает список:

alply(mat, 1, f)