2012-11-26 14 views
0

我正在尝试使用mapply函数创建一个等值线图。我是R的新手,我已经阅读了其他人的帖子,我还没有得到mapply函数的本质。我被困在以下问题。使用mapply的问题

我有一个函数px(它有2个参数)返回一个值。我正在尝试使用draw.graph函数来绘制轮廓图,该函数将采用2个序列(n1,n2)作为参数。但是,我不断收到一个错误,说轮廓()中的z不是矩阵。

我试图使用浏览器(),并意识到执行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. 
+0

您没有给出'dnorm'和'x'值。问题不在于'mapply',而在于你定义了'px'。 – joran

+0

...和'px'有另一个_big_语法错误,您的代码甚至永远不会到达。 – joran

+0

..._ and_当你解决所有这些问题时,你将会遇到'mapply'问题,它不会返回一个矩阵。您必须自己构建矩阵,然后将其传递给“轮廓”。 – joran

回答

1

这里代替使用mapply()你可以使用outer() ..而不是分段做所有的组合,我认为你想要什么? NB注意使用矢量化的()以创建矢量化函数接受mu.amu.b作为同时X载体是固定的所有组合。

这下面肯定有效(即产生一个工作图),但我不知道它应该看起来像那样?

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

你不x的任何值传递到这个功能...我假设你使用的是全球???淘气!

可以使PX FUN这样

px <- function(mu.a, mu.b, x) 
     { etc.. 

然后你就可以使用MoreArgs选项

y2 <- mapply(FUN=px,n1,n2, MoreArgs=list(x), SIMPLIFY = T) 

Y2是一个向量不是你需要重塑

矩阵指定x
dim(y2)=c(length(n2), length(n1)) 
+0

我的x是一个数据向量。但它有关系吗?因为函数px总是返回一个值。所以不管x是一个值还是一个向量都不重要,对吗? – mynameisJEFF

+0

对不起,你是对的我误读你的乐趣 - 我上面描述的将适用于所有情况。 –

+0

那么,我还需要MoreArgs = list(x)吗?它实际上做了什么?我读了MoreArgs上的Rhelp,但仍然没有完全得到它。心灵详细阐述了这一点? – mynameisJEFF