使用Hmisc和sf软件包时出现r单位错误

时间:2018-01-05 16:31:40

标签: r function hmisc sf

在我加载sf包之后尝试获取字段上的units属性时出现错误。

以下是可重现的例子。

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'

如何解决此错误

2 个答案:

答案 0 :(得分:3)

通常我发现LyzandeR的答案很有帮助。这个时间没那么多。这个问题在Hmisc :: units<-函数中提出了一个显然 not 的错误消息,因为它不会发生在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>"

答案 1 :(得分:2)

我将覆盖Error: 'units<-' is not an exported object from 'namespace:Hmisc'错误,忽略sf错误,该错误在42-anwser中有所涵盖。

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

units(fail.time) <- "Day"

所以,无论如何你都不需要Hmisc::units。我最初的猜测是你需要units<-。但是这显然不是从Hmisc导出的(正如您在错误中看到的那样)。您实际需要的是从units<-.default导出的反直观Hmisc方法。这有效:

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>