2012-11-26 11 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