了解警告信息

时间:2013-04-13 16:48:14

标签: r

我的代码如下:

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的长度(我不是确定其他警告信息的意思。)

有人可以帮我理解这个消息,所以我可以纠正我被警告的任何事情吗?

2 个答案:

答案 0 :(得分: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

您还可以搜索SO以获取[r]调试

的最佳做法

答案 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的误用,除非我遗漏了什么。