3

我正在使用 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 都定义为对象,但遇到了一个错误,我认为我已经追溯到环境和/或命名空间的问题。

我敢肯定,一定有一种更简单的方法可以做到这一点,如果有人有任何想法,或者罗伯特,如果你在那里并且可以照亮前进的方向,我将非常感激。

非常感谢,如果我不够具体,我们深表歉意。

4

0 回答 0