2017-05-31 19 views
0

に、私はいくつかのパラメータ、すなわち計算ロジスティック関数、「楽しい」、作成します。.enviラスターファイルを使用して、SOS、EOS、LOS、SPUDOY、およびP_Tamplitudeを。最終的には、各パラメータごとに別々のプロットを生成したいと考えています。)(計算値にリストを返す関数を入力するR

私はDATA_VALUEの "楽しさ" を実行する計算値()を使用します。 "fun"が1つの変数だけを返すときに機能します。しかし、fun()は前述の5つのパラメータすべてを返すときに失敗します。これはリストです。

new <- stack("1982_test.envi") 
new[new<=-1000]<-0 
Data_value<-new/10000 
DOY<-(1:nlayers(new)*15) 

fun<- function(x) { if (all(is.na(x[1]))) { return (NA) } else { 
fitForThisData <-nls(x~ a+((b/(1+ exp(-c*(DOY-e))))- (g/(1+ exp(-d*(DOY- 
f))))), alg="port",start=list(a=0.1,b=1,g=1,c=0.04,d=0.04,e=112,f=218), 
lower=list(a=0,b=0.3,g=0.3,c=-1,d=-1,e=20,f=100), 
upper=list(a=0.4,b=2,g=2,c=1,d=1,e=230,f=365), 
control=nls.control(maxiter=2000, tol = 1e-15, minFactor = 1/1024, 
warnOnly=TRUE)) 
SOS<-(coef(fitForThisData)[6] -(4.562/(2*coef(fitForThisData)[4]))) 
EOS<-(coef(fitForThisData)[7] -(4.562/(2*coef(fitForThisData)[5]))) 
LOS<-(EOS-SOS) 
SPUDOY<-(1.317*((-1/coef(fitForThisData)[4])+ coef(fitForThisData)[6])) 
P_TAmplitude<-(SPUDOY-SOS) 
return (c(SOS,EOS,LOS,SPUDOY,P_TAmplitude)) 
} 
} 

equation<-calc(Data_value,fun) 

上記のコマンドを実行すると、エラーが発生しています。 setValuesで エラー(アウト、X): 値は、数値、整数、論理的またはヘルプの任意の種類が理解されるであろう

plot(equation) 

因子でなければなりません。ありがとうございました!

+0

return(NA) 

:あなたのケースでは、次の行を変更してみ

しかし、1と5

です。 '?calc'から' forceapply = TRUE'引数を考えましたか? –

+0

私はベクトルがリストだと思います。それはRのちょっとした語彙です(http://www.r-tutor.com/r-introduction/vector)。 – Candice

+0

はRomanLuš[email protected]私はちょうど私が間違っている場合はR.が私を許し拾ったが、私はベクトルがリストであると思います。それはRのちょっとした語彙です(http://www.r-tutor.com/r-introduction/vector)。 I)は、(計算値にforceapply = TRUE使用してみました、私も同じエラーを得ました。私はサプライを使用することも考えていますが、ラスターデータでは機能しないと思います。私はおそらく、リストの代わりに行列の値を返すこともできると考えています。私はデータ(SOS、EOS、LOS、SPUDOYとP_TAmplitude)の5層を生成し、CALCを実行したいと思います()。私はRがデータの保存方法を理解していないと思う。思考? – Candice

答えて

0

私はいくつかのサンプルデータを使用して、コードを試してみましたが、私はNA値を挿入しない場合を除き、それは実際に動作します。 あなたが返すNA値の数に問題があるようです。 NAが発生する場合の長さは、NAが発生しない場合と同じである必要があります。 FWIW、 `fun`はリストを返しますが、ベクトルしません

return(rep(NA,5)) 
+0

あなたが提案したちょっとした微調整で5つのプロットが表示されています!どうもありがとうございました! @maRtin – Candice

+0

あなたは大歓迎です!あなたが私の答えを見つけたら、私はアップヴォートに感謝します。 @カンディス – maRtin

関連する問題