Как одновременно использовать 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')