2017-05-31 93 views
0

計算()創建一個邏輯函數,「樂趣」,計算幾個參數,即:SOS,EOS,LOS,SPUDOY和P_Tamplitude,使用.envi光柵文件。最終,我想爲每個參數生成單獨的圖。輸入一個函數,它返回一個列表到R中

我用鈣()對Data_value執行 「好玩」。它在「有趣」只返回一個變量時起作用。但是,當「fun」返回上述所有五個參數時,calc()失敗 - 這是一個列表。

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

FWIW,'fun'不返回一個列表,但一個載體。你是否考慮過''calc'的'forceapply = TRUE'參數? –

+0

我認爲矢量是一個列表。這在R.中是一種不同的術語。(http://www.r-tutor.com/r-introduction/vector)。 – Candice

+0

@RomanLuštrik我拿起R.原諒我,如果我錯了,但我覺得矢量是一個列表。這在R.中是一種不同的術語。(http://www.r-tutor.com/r-introduction/vector)。 我嘗試使用在計算值()forceapply = TRUE,我得到了同樣的錯誤,以及。我也在考慮使用sapply,但我認爲它不適用於柵格數據。我也在想也許我可以用矩陣而不是列表返回值。我想生成5層數據(SOS,EOS,LOS,SPUDOY和P_TAmplitude),並執行計算值()。我認爲R不知道數據應該如何存儲。思考? – Candice

回答

0

我想你的代碼有一些樣本數據和它的實際工作,除非我不插NA值。 它看起來像你返回的NA值的數量有問題。 發生NA時的長度需要與不發生NA時的長度相同。在你的情況下,它不過1和5

嘗試更改以下行:

return(NA) 

return(rep(NA,5)) 
+0

它現在向我展示了五個情節,並且您提出了小小的調整!非常感謝你! @maRtin – Candice

+0

不客氣!如果您發現我的答案有幫助,我將不勝感激。 @Candice – maRtin

相關問題