Как одновременно использовать sapply и применить для сокращения мультипликативной функции в R

Мне было интересно, как я мог бы использовать sapply а также lapply одновременно, чтобы я мог избежать написания своей функции под названием GG как это выглядит ниже?

GG = function(x, y) dnorm(250, mean = x, sd = y)*dnorm(265, mean = x, sd = y) *
                    dnorm(259, mean = x, sd = y)

PS знаю только если x в моей функции выше менялось, следующие могут работать:

     function(x) sapply(lapply(x, dnorm, x = c(250, 265, 259), 10), prod)

Но в моем случае x а также y оба различаются.

1 ответ

Решение

Мы можем использовать Map с Reduce от base R, Причина использования Map заключается в том, что функции могут применяться к соответствующим элементам передаваемых в него объектов. Вот, dnorm это функция, которая принимает каждый соответствующий элемент "х" и "у" в качестве mean а также sd аргументы пока он имеет постоянный вектор "х" (c(250, 265, 259)). Выход из Map это list и мы Reduce соответствующие элементы list до одного путем умножения (*)

GG1 <- function(x, y) Reduce(`*`, Map(dnorm, x = c(250, 265, 259),
                        mean = list(x), sd = list(y)))
identical(GG(24, 12), GG1(24, 12))
#[1] TRUE

identical(GG(32, 15), GG1(32, 15))
#[1] TRUE

Основываясь на комментариях ОП,

x <- seq(10,  40, length= 30)
y <- x
z <- outer(x, y, GG1)
persp(x, y, z , theta = 0, phi = 20, expand = 0.5, col = 'pink')

Другие вопросы по тегам