【问题标题】:Function works as object in global env but not from package函数在全局环境中作为对象工作,但不是来自包
【发布时间】:2017-12-16 22:06:54
【问题描述】:

我有一个函数可以创建栅格图层的样本变异函数。该函数采用RasterStackRasterBrick 并返回一个列表,其中每层有一个变异函数。该函数在 .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 并重新记录/安装我的包,但没有效果,我得到了同样的错误。
  • 除了DESCRIPTIONImports: 部分,您在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(...))时,将处理导入要求。

标签: r raster


【解决方案1】:

如果您查看raster::rasterToPoints,您可以看到

head(rasterToPoints)

#1 function (x, fun = NULL, spatial = FALSE, ...)                                      
#2 {                                                                                   
#3     nl <- nlayers(x)           

它首先调用的是nlayers。错误消息表明它得到一个numeric 向量,而它需要一个Raster* 对象。

问题似乎是您的变量data 不是Raster* 对象。所以你需要(至少)退后一步看看发生了什么。

【讨论】:

  • 这就是这个错误的奇怪之处,data 毫无疑问是一个 Raster* 对象(具体来说是RasterBrick,所以dlist 的每个元素都是一个RasterLayer,其中@ 987654333@ 应该可以工作)。当我用RasterBrick 测试.GlobalEnv 中的函数时,它按预期工作。但是当我写rm(sampvar_chrp) 并尝试使用相同的输入RasterBrick 从包中调用函数时,我得到了这个错误。我的包裹好像出了点问题,但我不确定在哪里。
  • 能否提供一个小而可重现的触发错误的样本数据?当我们无法自己触发时,真的很难提供帮助。
  • @r2evans 明白了!!问题是raster 包有它自己的as.list 函数,而且它似乎在全局环境中使用,但不是从包中使用。我按照您的建议在函数文档中添加了importFrom raster as.list,它可以正常工作!非常感谢您的帮助!
猜你喜欢
  • 2016-12-08
  • 2017-10-09
  • 2020-10-19
  • 2018-05-04
  • 2016-03-05
  • 2016-09-30
  • 1970-01-01
  • 2018-12-23
  • 2012-08-16
相关资源
最近更新 更多