我正在尝试使用mapply函数创建等值线图。我是一个R的新手,我读过别人关于mapply的帖子,但我仍然不明白mapply函数的本质。我被下面的问题困扰了。
我有一个函数px (接受2个参数),它返回一个值。我正在尝试使用draw.graph函数绘制等高线图,该函数将接受两个序列(n1,n2)作为参数。然而,我总是得到一个错误,说contour()中的z不是一个矩阵。
我尝试使用browser(),并意识到在执行mapply()之后,我没有得到一个矩阵。所以我的问题是,在这种情况下,如何使用mapply函数获得矩阵?如果可能的话,有人能指出我在代码中所犯的错误吗?我一直收到以下错误:
Error in contour.default(n1, n2, y) : no proper 'z' matrix specified
# This function returns a value only
px <- function(mu.a, mu.b)
{
#Note that x is just a vector in this context. specified
# outside the function. Since it is very long, I want specify it here.
n1 <- dnorm(x, mean = mu.a, sd = 0.3)
n2 <- dnorm(x, mean = mu.b, sd = 0.3)
pxd<- 0.7 * n1 + (1-0.7) * n2
return
{
prod(pxd)
}
}
#I am trying to generate a contour plot below of the function px.q3 with
# arguments n1,n2, which will be sequences
draw.graph <- function(n1,n2)
{
y <- mapply(px,n1,n2)
browser()
contour(n1,n2,y)
}
draw.graph(seq(1.0,1.6,0.01),seq(2.4,3,0.01))
My aim of the draw.graph function is to get a contour plot as a function mu.a(i.e. n1) and mu.b(i.e. n2) <- 2 sequences. 发布于 2012-11-27 07:55:43
在这里,您可以不使用mapply(),而使用()。NB注意使用Vectorize()创建一个矢量化函数,该函数接受mu.a和mu.b作为向量,而x<代码>E213对于所有组合都是固定的。
这在下面肯定是有效的(即生成一个有效的图),但我不确定它是否应该是这样的?
x1 = seq(0, 1,.1)
n1=seq(1.0,1.6,0.01)
n2=seq(2.4,3,0.01)
#question 3 - as a function mu.a, mu.b
px.q3 <- function(mu.a, mu.b, x=x1)
{
n1 <- dnorm(x, mean = mu.a, sd = 0.3)
n2 <- dnorm(x, mean = mu.b, sd = 0.3)
#p(x_d)
pxd<- 0.7 * n1 + (1-0.7) * n2
return
{
prod(pxd)
}
}
vectorised.px.q3=Vectorize(px.q3)
y= outer(n1,n2, FUN=vectorised.px.q3)
contour(n1,n2,y)发布于 2012-11-27 03:28:51
您没有将任何x值传递到此函数中...我假设您使用的是全局?淘气!
你可以像这样让px变得有趣
px <- function(mu.a, mu.b, x)
{ etc..然后,您可以使用MoreArgs选项指定x
y2 <- mapply(FUN=px,n1,n2, MoreArgs=list(x), SIMPLIFY = T)y2是一个向量,而不是需要重塑的矩阵
dim(y2)=c(length(n2), length(n1))https://stackoverflow.com/questions/13571030
复制相似问题