【问题标题】:Prefixing the c function from terra从 terra 为 c 函数添加前缀
【发布时间】:2021-03-15 13:49:27
【问题描述】:

在 R 中,我可以在函数前面加上它们所属的包的名称(例如,dplyr::select)。不过,我在使用 terra 包中的 c 执行此操作时遇到问题。我可以用base::c 做得很好(我应该这样做):

base::c(1, 2, 3)
# [1] 1 2 3   

但是,我在为terra 运行类似代码时遇到了问题:

# Dummy SpatRaster
foo <- terra::rast(matrix(1:9, ncol=3))

# Works fine
c(foo, foo) 

# Not so much
terra::c(foo, foo)
# Error: 'c' is not an exported object from 'namespace:terra'

我很困惑c不是terra 的导出函数,但我可以访问和使用它就好了......只要我不使用前缀。

问:有人能解释一下为什么会这样吗?我如何才能从terra 中明确引用c


PS ?terra::c 提供了一个帮助页面,解释了 c 如何将 SpatRasterobjects 组合成一个新的 SpatRaster 对象,这向我表明,这个函数必须terra 包。

【问题讨论】:

  • 你试过terra:::c(未导出)吗?它不在包 NAMESPACE 文件中,表明它依赖于 S3/S4 机制。 (我没有安装terra,否则我会自己测试。)(这似乎是一种S4方法,顺便说一句:github.com/rspatial/terra/blob/…
  • @r2evans 也给出了一个错误,但出现了一个新错误:Error in get(name, envir = asNamespace(pkg), inherits = FALSE) : object 'c' not found
  • 是的,这表明(对我而言)这是一种 S4(不是 S3)方法,与在代码中未找到 c.Spat* 一致(尽管我没有搜索所有文件)。 showMethods("c") 是否暗示它的存在?如果是这样,getMethod("c", "SpatRaster")(或任何它的签名)应该返回该函数,然后您可以将其分配给“常规”函数,或者(如果很少)立即与 getMethod(...)(1,2,3) 一起使用它。
  • 你不需要直接引用c函数terra。我如何从文档中理解,c 函数是“S4 签名'SpatRaster' 方法”,这意味着它不是 terra 的新函数,它只是通过添加新签名来扩展现有的base::c 函数。您可以拨打base::c(foo, foo),它工作正常。
  • showMethods("c") 显示x="SpatRaster"x="SpatDataSet"。谢谢,乔纳斯——我想我并没有真正意识到它是base::c 的扩展,但考虑到这种行为,这是有道理的。显然,我需要了解这些扩展是如何工作的。谢谢你们的帮助!

标签: r terra


【解决方案1】:

这是因为c 是一个“原始”函数——它们遵循自己的规则。一个包不能/不需要导入和导出它们

c
#function (...)  .Primitive("c")

情况并非如此,例如nrow

nrow
#function (x) 
#dim(x)[1L]
#<bytecode: 0x000000001662d228>
#<environment: namespace:base>

然后 terra 从中创建一个通用函数,并将其导出,以便您可以执行 terra::nrow()

您的问题促使我对此进行了更多研究,我注意到在当前版本的 terra 中,如果您不使用 library(terra) 加载包,许多原始函数将不起作用。例如,你得到

foo <- terra::rast(matrix(1:9, ncol=3))
x <- c(foo, foo) 
max(x)
#Error in x@ptr$summary(fun, na.rm, .terra_environment$options@ptr) : 
#  trying to get slot "ptr" from an object of a basic class ("NULL") with no slots 

我刚刚在开发版中修复了这个问题;并且使用该版本,上述返回

#class       : SpatRaster 
#dimensions  : 3, 3, 1  (nrow, ncol, nlyr)
#resolution  : 1, 1  (x, y)
#extent      : 0, 3, 0, 3  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +no_defs 
#source      : memory 
#names       : max 
#min values  :   1 
#max values  :   9 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2018-08-19
    • 2018-10-03
    相关资源
    最近更新 更多