【发布时间】: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的扩展,但考虑到这种行为,这是有道理的。显然,我需要了解这些扩展是如何工作的。谢谢你们的帮助!