如何同时使用sapply并应用于缩短R中的乘法函数

时间:2017-04-20 17:45:48

标签: r function lapply sapply

我想知道如何同时使用sapplylapply以便我可以避免编写名为GG的函数,如下所示?

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

P.S。我知道如果我上面的函数中只有x变化,以下情况可能有效:

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

但在我的情况下xy都有所不同。

1 个答案:

答案 0 :(得分:3)

我们可以将MapReduce base R一起使用。使用Map的原因是函数可以应用于传递给它的对象的相应元素。在这里,dnorm是获取' x'的每个对应元素的函数。并且' y'作为meansd参数,它有一个常数向量" x" (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

根据OP的评论,

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')

enter image description here