2013-04-13 94 views
0

我的代碼如下:瞭解警告消息

m<-c(9,17,33,65,129,257,513) 
results<-matrix(,7,5) 
results[,1]<-m 

#methods 
trap<-function(a,b,m,func) 
{ 
    h=(b-a)/(m-1) 
    x<-seq(a,b,h) 
    y<-function(x) { 
    z<-eval(parse(text=func)) 
    return(z) 
    } 
    result<-h*(0.5* y(x[1]) + sum(y(x[2:(length(x)-1)]))+ 0.5*y(x[length(x)])) 
    result 
} 

當我運行以下命令:trap(0,5,results[,1],"x^2") 我得到了想要的輸出,但我也得到一個討厭的警告信息:

Warning messages: 
1: In if (n < 0L) stop("wrong sign in 'by' 
argument") : the condition has length > 1 and only the first element 
will be used 
2: In if (n > .Machine$integer.max) stop("'by' argument 
is much too small") : the condition has length > 1 and only the 
first element will be used 
3: In 0L:n : numerical expression has 7 
elements: only the first used 
4: In (0L:n) * by : longer object 
length is not a multiple of shorter object length 
5: In if (by > 0) 
pmin(x, to) else pmax(x, to) : the condition has length > 1 and only 
the first element will be used 

所以我着手試圖理解發生了什麼,看起來一切都指向這個:x<-seq(a,b,h)但我的序列不應該是負數,它應該始終創建一個大於1的長度(我不確定其他警告消息的含義)。

有人可以幫助我理解這條信息,所以我可以糾正我被警告的任何事情嗎?

回答

1

確定最佳實踐你所得到的預期輸出?任何方式我讀?seq,它看起來像「by」參數應該是一個數字,而不是在你的例子中的向量。這就是你得到惡劣警告的原因,因爲h不是一個單一的數字,而是一個向量。

你從seq(a,b,h)獲得序列很奇怪:

> seq(a,b,h) 
[1] 0.00000000 0.31250000 0.31250000 0.23437500 0.15625000 0.09765625 0.05859375 
[8] 4.37500000 2.50000000 

我覺得seq是專爲生成單調序列,但什麼出來你的例子既不是單調,也沒有作出任何意義......

你確定最終的結果是你的預期嗎?在任何情況下,這看起來像是一個濫用seq,除非我失去了一些東西。

+0

呃,我想我必須把它放在循環中,除非有人知道另一種方式。但我認爲這個答案最清楚地解釋了警告信息,所以我會接受,但是@DWin謝謝你,你的回答總是有幫助的! – mrkb80

1

您可以觸發錯誤,以便traceback()可用於調試警告,儘管在這裏可能不需要;

options(warn=2) # usual setting is 1 

鍵入它來顯示你的功能是看到了論據:

> c(a=0, b=5,m= results[,1]) 
    a b m1 m2 m3 m4 m5 m6 m7 
    0 5 9 17 33 65 129 257 513 

所以這就是第一個警告約seq(, , by=.)讓過長的說法從何而來,(因爲h只要將作爲'm'的論點,我認爲這也大多解釋了其他的警告,我不知道如何讓warn()機制跳過第一個或第n個waring,但如果你放棄瀏覽器你可以這樣做:

?browser 

你也可以搜索,以便爲[R]調試

+0

謝謝@DWin。你能幫助我理解'h'只要'm'意味着什麼?我可以很容易地將這個調用放在一個對所有m值的循環中,但是這不會是r(我在1:7中)trap(0,5,result [i,1],「x^2」)' 「最佳」還是我忽略這些警告? – mrkb80

+0

當你創建'h =(b-a)/(m-1)'時,'a'和'b'是標量,但'm'是一個向量,所以結果是一個向量。既然你沒有真正告訴我們這些值應該是什麼或你在做什麼,除了向我們顯示錯誤的代碼之外,不可能告訴你如何繼續。 –