0

加载 sf 包后,当我尝试获取字段的单位属性时出现错误。

下面是一个可重现的例子。

library(Hmisc)

fail.time <- c(10,20)
units(fail.time) <- "Day"

library(sf)
units(fail.time) <- "Day"

 Error: inherits(value, "units") || inherits(value, "symbolic_units") is not TRUE

如果我指定了包和函数,我会收到错误,一条不同的错误消息

Hmisc::units(fail.time) <- "Day"

Error: 'units<-' is not an exported object from 'namespace:Hmisc'

我怎样才能绕过这个错误

4

2 回答 2

3

通常我发现 LyzanderR 的答案很有帮助。这次没有那么多。该问题提出了一条显然不是来自 Hmisc::units<-函数的错误消息,因为它不是在第一个实例中units(fail.time) <- "Day"发生,而是在加载 pkg:sf 之后发生。如果您查看说明文件,sf您会发现它有Imports:units. 事实上,正是它units::unit<-.numeric引发了最初的神秘错误。如果只加载 Hmisc(而不是 sf)重新启动 R,您会看到只有两种units<-方法:

> methods(`units<-`)
[1] units<-.default  units<-.difftime
see '?methods' for accessing help and source code

如果您加载 sf 包,您现在可以看到units::units<-.numeric引发错误的是(新加载的)函数,因为该包已被加载,sf并且实际上没有该函数的预先存在.numeric版本,因此产生了“现有函数域的掩蔽”(也许更准确地说是“转移”),并且没有自动生成的警告。

> library(sf)
Linking to GEOS 3.6.1, GDAL 2.1.3, proj.4 4.9.3
> methods(`units<-`)
[1] units<-.default  units<-.difftime units<-.numeric* units<-.units*  
see '?methods' for accessing help and source code
> getAnywhere(`units<-.numeric`)
A single object matching ‘units<-.numeric’ was found
It was found in the following places
  registered S3 method for units<- from namespace units
  namespace:units
with value

function (x, value) 
{
    stopifnot(inherits(value, "units") || inherits(value, "symbolic_units"))
    if (inherits(value, "units")) 
        value <- units(value)
    attr(x, "units") = value
    class(x) <- "units"
    x
}
<environment: namespace:units>

包的维护者现在意识到我们中的一些人正在困惑:

 maintainer('sf')
[1] "Edzer Pebesma <edzer.pebesma@uni-muenster.de>"
于 2018-01-05T18:03:45.057 回答
2

我将介绍Error: 'units<-' is not an exported object from 'namespace:Hmisc'下面的错误,忽略sf42- 的答案中涵盖的错误。

units<-是替换函数。这些是您在函数位于赋值运算符左侧时看到的特殊函数,例如:

units(fail.time) <- "Day"

所以,无论如何你都不需要Hmisc::units。我最初的猜测是你需要units<-. 但这显然不是从那里导出的Hmisc(您也可以在错误中看到)。您真正需要的是units<-.defaultHmisc. 这有效:

fail.time <- c(10,20)
Hmisc::`units<-.default`(fail.time, "Day")
#[1] 10 20
#attr(,"units")
#[1] "Day"

当您使用units(fail.time) <- "Day"上述内容时,您实际调用的是什么。

只是为了完成,这units<-.default看起来像:

`units<-.default`
#function (x, value) 
#{
#    attr(x, "units") <- value
#    x
#}
#<environment: namespace:Hmisc>
于 2018-01-05T16:46:32.463 回答