В чем разница между Саппи и Саппи в R? Когда вы должны использовать один против другого? Бонус: когда вы должны использовать vapply?


Ответ 1:

Я предполагаю, что вы уже знаете, что делает * apply function :-).

Основное различие между lapply и sapply в том, что sapply постарается максимально упростить вывод lapply. Если ваша функция возвращает одно значение для каждого элемента списка, sapply вернет вектор с этими значениями, например, полезно, когда вы хотите проверить длину элементов списка.

Другая возможность состоит в том, что ваша функция возвращает векторы одинакового размера для каждого элемента списка, например, функции диапазона и квантиля. В этом случае sapply вернет матрицу с числом строк, равным длине ваших векторов, и числом столбцов, равным длине списка.

В случае, если sapply не может упростить вывод, он будет вести себя точно так же, как и lapply.

Теперь неоднозначность возвращаемых значений в sapply (иногда список, иногда матрица или вектор) делает разработку пакетов с ним немного сложнее, чем следовало бы. Вы должны (или, по крайней мере, должны) вручную проверять класс каждого возвращаемого значения при использовании sapply и генерировать соответствующие исключения. Vapply решает эту проблему с помощью аргумента FUN.VALUE. Вы должны явно определить, что вы выводите (символ, число, целое число, коэффициент или что-то еще) и длину вывода.

Я думаю, вы уже можете себе представить, когда использовать vapply: всякий раз, когда вы разрешаете кому-либо использовать ваши функции, вы должны отказаться от sapply в пользу vapply :-).


Ответ 2:

sapply просто попытается упростить результат lapply, если это возможно. Так:

  • Если результатом lapply является список, в котором каждый элемент имеет длину один, тогда sapply вернет вектор. Если результатом является список, в котором каждый элемент является вектором одинаковой длины (> 1), возвращается матрица. не могу понять вещи, список возвращается.

например:

с радостью:

> x <- список (a = 1: 4, b = rnorm (10), c = rnorm (20, 1), d = rnorm (100, 5))> lapply (x, среднее) $ a [1] 2.5 $ b [1] 0,06082667 $ c [1] 1,467083 $ d [1] 5,074749

с саппли:

> sapply (x, среднее) abcd 2.50000000 0.06082667 1.46708277 5.07474950

Ответ 3:

Может быть, я могу дать вам пример:

Это будет работать, но второй не может:

№ 1

l <- list ("a", "b", c ("x", "y"), c ("1", "3", "4"))

SZ <- Макс (Саппли (л, функция (х) длина (х)))

№ 2

l <- list ("a", "b", c ("x", "y"), c ("1", "3", "4"))

sz <- max (длина (l, функция (x) длина (x)))

Потому что функция max () не применяется к списку, а только к вектору. И lapply возвращает список, а sapply возвращает вектор.