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)です. .

誰かがこのメッセージを理解するのを手伝ってくれるので、警告されていることを修正できますか?

4

2 に答える 2

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 番目の警告までスキップしますが、ブラウザにドロップした場合は、それを行うことができます。

?browser

SO で [r] デバッグのベスト プラクティスを検索することもできます。

于 2013-04-13T17:11:05.493 に答える