【问题标题】:r units error when using Hmisc and sf packages使用 Hmisc 和 sf 包时出现 r 单位错误
【发布时间】:2018-01-05 16:31:40
【问题描述】:

在我加载 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'

如何解决这个错误

【问题讨论】:

    标签: r function hmisc sf


    【解决方案1】:

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

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

    如果您加载 sf 包,您现在可以看到抛出错误的是(新加载的)units::units&lt;-.numeric 函数,因为该包是由 sf 加载的,并且实际上没有预先存在的 @ 987654330@ 版本的函数,对现有函数的域进行了“屏蔽”(更准确地说是“转移”),并且没有自动生成警告。

    > 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>"
    

    【讨论】:

    • 感谢@42- 的提及。我想我的回答并不清楚我什至没有查看sf 错误。我的回答仅涵盖第二个错误,甚至没有加载 sf 库。如果你不加载 sf 那么 Hmisc::units(fail.time, "Day") 实际上会被调用,但我会确保它是清晰的。
    • 没有屏蔽:units&lt;-.defaultHmiscunits&lt;-.numericunits(由sf 加载)。由于fail.time 是数字,因此在加载sf 后,会选择units&lt;-.numeric 方法,因为它与它的类匹配。
    • 我(最终)确实意识到units.numeric 版本是新的,这可能是没有警告的原因。我最终发现错误的原因是 ud_units 列表中存在一组固定的单位值,该列表作为加载 sf 包的副作用而被加载(没有真正的通知)。我认为错误消息应该清楚地查看?units::ud_units(一旦该帮助页面确实有用。)
    【解决方案2】:

    我将在下面讨论Error: 'units&lt;-' is not an exported object from 'namespace:Hmisc' 错误,而忽略sf 错误,这在42-'s anwser 中有介绍。

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

    units(fail.time) <- "Day"
    

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

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

    当您使用units(fail.time) &lt;- "Day" 时,上面是您实际调用的内容。

    为了完成,这就是units&lt;-.default 的样子:

    `units<-.default`
    #function (x, value) 
    #{
    #    attr(x, "units") <- value
    #    x
    #}
    #<environment: namespace:Hmisc>
    

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 2021-07-16
      • 2011-12-19
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多