0

Rでこの単純な関数を書きました

> w=c(0.005,0.005,0.006,0.01,0.88,0.03,0.01,0.01,0.005,0.34,0.05)  
> trial<- function(a) {sum(a-w)}  
> trial(0.1)  
[1] 0.996

ご覧のとおり、a の値を入力するとこの関数は正常に動作しますが、プロットしたいので、合計を含まない関数とは異なり、次の関数は動作しません。

> plot(trial)

私にエラーを与える:

> Error in xy.coords(x, y, xlabel, ylabel, log) :  
  'x' and 'y' lengths differ  
In addition: Warning message:  
In a - w : longer object length is not a multiple of shorter object length

R が長さ 11 のベクトルを要求していることは理解していますが、この関数をプロットする方法はありますか?

4

2 に答える 2

2

問題はあなたの機能とそれがあなたに与えると期待するもの、そしてあなたがコーディングしたものにあると思います。

sum(a-w)単一の数値を返します。

そのため、ベクトルを渡すと (plot.function メソッドと基になるcurve関数が行うように)、シーケンスが作成seq(0,1,n=101)されます (デフォルトで)。

これで、関数はa-w合計する前に作成されます。したがって、 が単一の値または同じ長さのベクトルである場合にのみ意味があります。w

trial(seq(0,1,length.out = 101))
[1] 38.331
Warning message:
In x - w : longer object length is not a multiple of shorter object length

それは答えを与えますが、おそらく愚かなことをしようとしたという警告です。

エラーは、Rがプロットを作成するときに作成しているという事実から来ています

plot(seq(0,1,length.out = 101), trial(seq(0,1,length.out = 101))

エラーが発生します。

 Error in xy.coords(x, y, xlabel, ylabel, log) : 
 'x' and 'y' lengths differ

したがって、問題は、ベクトルが指定されたときに関数に何を返したいかですa

それはあるべきa- sum(w)ですか?その場合、関数を実際に再定義して、必要なものを反映する必要があります

trial2 <- function(a) {a - sum(w)}

その後

plot(trial2)

素敵な(多少面白くない場合でも)直線が得られます

ここに画像の説明を入力

再定義するまでw

w <- 'something else'

plot(trial2)
Error in sum(w) : invalid 'type' (character) of argument

これは、関数内のグローバル変数に依存することの問題です。

于 2013-01-09T00:22:45.430 に答える
1

これがあなたが望んでいたものかどうか疑問に思います:

trial<- function(x) {cumsum(x)}
plot(seq_along(w),  trial(w), type="l")

ここに画像の説明を入力 それは単なる推測ですが。これが正しければ (そして、それがまさにあなたが望んでいたものでなくても)、2 つの教訓があります。1) 問題を自然言語で完全に説明します。2) ベクトルを返す関数を使用します。cumsumおよびcumprod関数は、導入テキストでは目立たない可能性があると思います。また、そのような状況ではpminpmax新しいユーザーが最大と最小の努力に失敗したときに必要になることがよくあります。

また、これはあなたが期待したものです:

trial<- function(x) {cumsum(x-w)}
  plot(seq_along(w),  trial(0.1), type="l")

はるかにギザギザのプロット結果になります。滑らかさが必要な場合は、 を検索してsmooth.splineください。

于 2013-01-09T00:28:09.077 に答える