我有一个函数来创建栅格图层的样本变量图。该函数采用RasterStack
或RasterBrick
并返回每层有一个变异函数的列表。当它在.GlobalEnv
中加载时,该功能正常工作,但是当我从包中使用它时,我收到的错误是:
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘nlayers’ for signature ‘"numeric"’
回溯说我在使用rasterToPoints
函数的行中出现了问题,并且在lapply
dlist
上的行中出现了问题1}},但我不知道为什么要使用nlayers()
,或者为什么在尝试使用包中的函数时它只是一个问题。
以下是roxygen2评论的功能:
#' Create sample variograms of CHIRPS data
#'
#' @name sampvar-chrp
#' @title Create sample variograms of CHIRPS data
#'
#' @param data RasterStack of CHIRPS images
#' @return List of sample variograms
#' @examples
#' data(chrprf)
#' sampvar_chrp(chrprf)
#' @export
sampvar_chrp <- function(data) {
dlist <- as.list(data)
spdf <- lapply(dlist, function(x){
names(x) <- "rain"
pts <- rasterToPoints(x, spatial = TRUE)
})
rsamp <- lapply(spdf, function(x){
s <- x[sample(1:length(x), size = 150), ]
})
chrp_vario <- lapply(rsamp, function(x){
v <- variogram(object = rain ~ 1, data = x)
})
return(chrp_vario)
}
我感谢任何建议!
编辑:我认为(至少部分)问题是当从包运行函数时data
未成功转换为列表。我编辑了函数,重新编写,重新安装,并获得了"error"
print语句。所以看起来as.list(data)
在全局环境中起作用,但不能从我的包中运行。这是编辑过的功能:
#' Create sample variograms of CHIRPS data
#'
#' @name sampvar_chrp
#' @title Create sample variograms of CHIRPS data
#'
#' @param data RasterStack of CHIRPS images
#' @return List of sample variograms
#' @importFrom raster rasterToPoints
#' @examples
#' data(chrprf)
#' sampvar_chrp(chrprf)
#' @export
sampvar_chrp <- function(data) {
dlist <- as.list(data)
if (is.list(dlist) == TRUE) {
spdf <- lapply(dlist, function(x){
names(x) <- "rain"
pts <- rasterToPoints(x, spatial = TRUE)
})
rsamp <- lapply(spdf, function(x){
s <- x[sample(1:length(x), size = 150), ]
})
chrp_vario <- lapply(rsamp, function(x){
v <- variogram(object = rain ~ 1, data = x)
})
return(chrp_vario)
} else { print("error")}
}
答案 0 :(得分:1)
如果你看raster::rasterToPoints
,就可以看到
head(rasterToPoints)
#1 function (x, fun = NULL, spatial = FALSE, ...)
#2 {
#3 nl <- nlayers(x)
它所称的第一件事是nlayers
。该错误消息表明它获得了numeric
向量,而它需要一个Raster*
对象。
问题似乎是您的变量data
不是Raster*
对象。所以你需要(至少)退一步看看发生了什么。