【问题标题】:Subclass of integer64 staying after logical operation (R)逻辑运算后保留的 integer64 的子类 (R)
【发布时间】:2013-02-11 14:34:31
【问题描述】:

当我从 bit64 子类化 integer64 对象然后执行相等测试时,结果包含逻辑数据,但仍归入我的类而不是逻辑。例如,整数不会发生这种情况。

示例代码:

library(bit64)
x = as.integer64(5)
class(x) = c("Foo", "integer64")
x == 5

返回

[1] TRUE
attr(,"class")
[1] "Foo"

注意它仍然有类“Foo”

如果我们对整数做同样的事情:

y = as.integer(5)
class(y) = c("Foo", "integer")
y == 5

返回逻辑

[1] TRUE

知道为什么会这样吗?

【问题讨论】:

    标签: r subclass r-s3


    【解决方案1】:

    查看integer64变量的equals实现。

    `==.integer64`
    function (e1, e2) 
    {
        a <- binattr(e1, e2)
        e1 <- as.integer64(e1)
        e2 <- as.integer64(e2)
        ret <- logical(max(length(e1), length(e2)))
        .Call("EQ_integer64", e1, e2, ret)
        a$class <- minusclass(a$class, "integer64")
        setattributes(ret, a)
        ret
    }
    

    返回值被明确地赋予一个类属性,等于a的类减去"integer64"类。

    binattr,创建变量a 是一个相当奇怪的函数,它检查两个输入是否具有兼容的大小,然后返回一个或另一个的属性,具体取决于哪个具有dim属性。

    【讨论】:

    • 好地方 - 知道他们为什么要这样做吗?
    • 大胆猜测:我认为主要问题是将dim 属性复制到结果中,因此矩阵输入不会变平。复制类应保留任何特殊方法,例如打印。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多