Функция, которая не создает объект SpatialGridDataFrame
Я пытаюсь создать функцию, которая преобразует цифровой номер спутниковых изображений в яркость, но я не знаю, почему мой конечный объект является числовым, а не объектом SpatialGridDataFrame, если я указал в своем классе функций (results) == "SpatialGridDataFrame". Мой код:
пакеты
require(raster)
require(sp)
RasterLayer моделируется
r <- raster(nrows=10, ncols=10)
r <- setValues(r, 1:ncell(r))
plot(r)
band2<- as(r, 'SpatialGridDataFrame') ### convert in SpatialGridDataFrame
Функция от DN к сиянию
radconvL<-function(x, band = 2)
{
Lmax <- switch(as.character(band),
"2" = 120.64,
"3" = 151.31,
"4" = 157.57,
"5" = 69.03,
NA)
if (is.na(Lmax)) stop("invalid band")
Lmin = 0
Qmax = 127
x <- as.vector(as.matrix(x))
results <- x
x <- Lmin + ((Lmax-Lmin)*x)/Qmax
if (class(results) == "SpatialGridDataFrame")
results@data[, 1] <- x
else if (is.data.frame(x))
results <- data.frame(matrix(x, nrow = nrow(results),
ncol = ncol(results)))
else results <- x
print(paste(band, Lmax))
print(results)
results
}
-Попробуйте функцию
teste2<-radconvL(band2, band = 2)
str(test2)## Numeric!!!! Why???
Может ли кто-нибудь помочь мне?
Спасибо,
Александр
1 ответ
Я покажу, как вы можете сделать эту работу:
radconvL <- function(x, band = 2) {
Lmax <- switch(band,
"2" = 120.64,
"3" = 151.31,
"4" = 157.57,
"5" = 69.03,
NA)
if (is.na(Lmax)) stop("invalid band")
Lmin = 0
Qmax = 127
Lmin + ((Lmax-Lmin)*x)/Qmax
}
library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
test <- radconvL(b[[2]], band = 2)
test
это RasterLayer
, но если вам нужна SpatialGridDataFrame
(почему?) использовать:
sptest <- as(test, 'SpatialGridDataFrame')
Это не прямой ответ на ваш вопрос, но очень трудно понять, почему вы делаете некоторые вещи, которые вы делаете в функции. Например, вы делаете:
x <- as.vector(as.matrix(x))
results <- x
x <- Lmin + ((Lmax-Lmin)*x)/Qmax
так results
а также x
являются вектором, но тогда вы делаете:
if (class(results) == "SpatialGridDataFrame")
#(...)
else if (is.data.frame(x))
#(...)
else results <- x
Насколько это актуально, когда мы знаем, что x
это вектор (а не SpatialGridDataFrame
или data.frame
)? Это всегда собирается сделать results
равно x
, Таким образом, очевидно, что результат всегда будет числовым.
Вы заявляете, что делаете: class(results) == "SpatialGridDataFrame"
, но вы этого не делаете. В любом случае, это не сработало бы (это сродни тому, чтобы положить на него велосипед с "автомобилем"; это волшебным образом не даст ему четыре колеса и двигатель внезапно).
Если вы хотите ускорить процесс загрузки всех значений в память, вы можете сделать:
radconvL <- function(x, band = 2) {
Lmax <- switch(band,
"2" = 120.64,
"3" = 151.31,
"4" = 157.57,
"5" = 69.03,
NA)
if (is.na(Lmax)) stop("invalid band")
Lmin = 0
Qmax = 127
setValues(x, Lmin + ((Lmax-Lmin)*values(x))/Qmax)
}