我的代码如下:
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的长度(我不是确定其他警告信息的意思。)
有人可以帮我理解这个消息,所以我可以纠正我被警告的任何事情吗?
答案 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
的误用,除非我遗漏了什么。