2013-04-13 95 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'是一个向量,所以结果是一个向量。既然你没有真正告诉我们这些值应该是什么或你在做什么,除了向我们显示错误的代码之外,不可能告诉你如何继续。 –