如何同时使用 sapply 和 apply 来缩短 R 中的乘法函数
How to simultaneously use sapply and apply to shorten a multiplicative function in 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)
P.S. 我知道如果我上面的函数中只有 x
有所不同,下面的函数就可以工作:
function(x) sapply(lapply(x, dnorm, x = c(250, 265, 259), 10), prod)
但在我的情况下 x
和 y
都不同。
我们可以使用 Map
和 base R
中的 Reduce
。使用 Map
的原因是函数可以应用于传递给它的对象的相应元素。这里,dnorm
是将 'x' 和 'y' 的每个对应元素作为 mean
和 sd
参数的函数,同时它有一个常数向量 "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')
我想知道如何同时使用 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)
P.S. 我知道如果我上面的函数中只有 x
有所不同,下面的函数就可以工作:
function(x) sapply(lapply(x, dnorm, x = c(250, 265, 259), 10), prod)
但在我的情况下 x
和 y
都不同。
我们可以使用 Map
和 base R
中的 Reduce
。使用 Map
的原因是函数可以应用于传递给它的对象的相应元素。这里,dnorm
是将 'x' 和 'y' 的每个对应元素作为 mean
和 sd
参数的函数,同时它有一个常数向量 "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')