【发布时间】:2017-12-16 22:06:54
【问题描述】:
我有一个函数可以创建栅格图层的样本变异函数。该函数采用RasterStack 或RasterBrick 并返回一个列表,其中每层有一个变异函数。该函数在 .GlobalEnv 中加载时工作正常,但是当我从包中使用它时,我收到一条错误消息:Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘nlayers’ for signature ‘"numeric"’
回溯说出现问题我使用rasterToPoints 函数的行,以及我在dlist 上使用lapply 的行,但我不知道为什么要使用nlayers(),或者为什么在尝试时它只是一个问题使用包中的函数。
这里是 roxygen2 cmets 的函数:
#' 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"打印语句。所以看起来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")}
}
【问题讨论】:
-
如果
rasterToPoints来自不同的包,您是否导入了该函数/包?您共享的内容中没有导入指令。 -
@joran 是的,它来自另一个包,
raster包,我在说明的Imports部分设置了它。我还尝试将该行更改为raster::rasterToPoints并重新记录/安装我的包,但没有效果,我得到了同样的错误。 -
除了
DESCRIPTION的Imports:部分,您在NAMESPACE中是否有importFrom(raster,rasterToPoints)或import(raster)? -
@r2evans 不,我没有,我的
NAMESPACE中只有export我记录的函数行。我的包中没有包含 roxygen cmets 的 .R 文件。我猜这就是我为NAMESPACE定义import语句的地方?我是 R 新手,不确定该组件是否必要。 -
一个很好的软件包参考是 Hadley 的 R packages,您可以在其中找到关于 Namespaces(带/不带 roxygen)和 Object documentation 的具体讨论。我个人更喜欢在需要它的特定功能中包含
@importFrom raster rasterToPoints;除了本地记录要求外,如果我从包中删除该函数,下次我重新生成NAMESPACE(例如devtools::document(...))时,将处理导入要求。