我正在使用Robert Hijmans的软件包'dismo'进行作物气候建模,更具体地说是'ecocrop'功能。 Ecocrop调用了一系列“隐藏”函数,包括.doEcocrop(ecocrop和.doEcocrop粘贴在下面),它计算ecocrop的最终输出。
.doEcocrop <‐ function(crop, tmin, tavg, prec, rainfed) {
if (rainfed)
{
nasum <‐ sum(is.na(c(tmin, tavg, prec)))
} else {
nasum <‐ sum(is.na(c(tmin, tavg)))
}
if (nasum > 0) { return( new('ECOCROP')) }
duration <‐ round((crop@GMIN + crop@GMAX) / 60)
tmp <‐ c(crop@TMIN, crop@TOPMN, crop@TOPMX, crop@TMAX)
temp <‐ .getY(tmp, tavg)
ktmp <‐ c(crop@KTMP, crop@KTMP, Inf, Inf)
tmin <‐ .getY(ktmp, tmin‐5)
if (rainfed) {
pre <‐ c(crop@RMIN, crop@ROPMN, crop@ROPMX, crop@RMAX)
shftprec <‐ c(prec[12], prec[‐12])
cumprec <‐ movingFun(prec, n=duration+1, fun=sum, type='from', circular=TRUE) + shftprec
prec <‐ .getY(pre, cumprec)
allv <‐ cbind(temp, tmin, prec)
} else {
allv <‐ cbind(temp, tmin)
}
minv <‐ apply(allv, 1, min)
obj <‐ new('ECOCROP')
obj@crop <‐ crop
obj@suitability <‐ movingFun(minv, n=duration, fun=min, type='from', circular=TRUE)
obj@maxsuit <‐ max(obj@suitability)
if (obj@maxsuit > 0) {
obj@maxper <‐ which(obj@suitability==max(obj@suitability))
} else {
obj@maxper <‐ 0
}
return(obj)
}
ecocrop <‐ function(crop, tmin, tavg, prec, rainfed=TRUE, ...) {
if (class(crop) == 'character') {
crop <‐ getCrop(crop)
}
if (missing(prec) & rainfed) {
stop('prec missing while rainfed=TRUE' )
}
if (inherits(tmin, 'Raster')) {
if (nlayers(tmin) != 12) {
stop()
}
.ecoSpat(crop, tmin, tavg, prec, rainfed)
} else {
.doEcocrop(crop=crop, tmin=tmin, tavg=tavg, prec=prec, rainfed=rainfed, ...)
}
}
我只是想知道是否有一个简单的方法从函数中提取例如'allv'和'minv',或者我是否需要将它们重新定义为对象并重新编写函数?我反复试过这个,将allv和minv定义为对象,但是遇到了错误,我认为我已经追溯到环境和/或命名空间的问题。
我确信如果有人有任何想法,必须有一种更简单的方法,或者罗伯特,如果你在那里并且可以发出光明,我会非常感激。
非常感谢并且道歉,如果我没有充分具体的话。