gpt4 book ai didi

r - 为新类定义 S3 "Math"组泛型时出现意外的 log2 错误

转载 作者:行者123 更新时间:2023-12-04 18:19:40 26 4
gpt4 key购买 nike

我正在尝试将 S3“数学”组泛型用于自定义类。但是我得到了一个奇怪的结果:log()log2 时工作和 log10产生错误。下面是一个最小的例子:

# simple class with just the new name
lameclass <- function(x) {
class(x) <- append(class(x), "lame")
x
}

# It prints something when Math generics methods are used
Math.lame <- function(x, ...) {
print("I am lame")
NextMethod()
}

# an object of the class
lamevector <- lameclass(1:10)

> class(lamevector)
[1] "integer" "lame"

现在尝试调用 log :
log(lamevector)
[1] "I am lame"
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379 1.7917595 1.9459101 2.0794415 2.1972246 2.3025851

以 2 为基数:
log(lamevector, 2)
[1] "I am lame"
[1] 0.000000 1.000000 1.584963 2.000000 2.321928 2.584963 2.807355 3.000000 3.169925 3.321928

以上所有工作。但是现在 log2包装:
log2(lamevector)
[1] "I am lame"
[1] "I am lame"
Error in log2.default(1:10, 2) :
2 arguments passed to 'log2' which requires 1

也许有人可以帮助我弄清楚这里发生了什么? log2 实际上是否经历了 2 次通用数学定义并失败了?

最佳答案

似乎正在发生的是 NextMethod没有剥离 lame类,所以当 log2来电log ,它重新发送到 lame方法,现在不再有效,因为它正在调用 log2base = 2L , 参数 log2没有。

强制调度正常工作不需要太多工作——只需剥离并重新添加类。 (旁白:子类应该被添加,而不是被添加。)

lameclass <- function(x) {
class(x) <- c("lame", class(x)) # prepend new class
x
}

Math.lame <- function(x, ...) {
print("I am lame")
class(x) <- class(x)[class(x) != "lame"] # strip lame class
lameclass(NextMethod()) # re-add lame class to result
}

lamevector <- lameclass(1:5)

log(lamevector)
#> [1] "I am lame"
#> [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
#> attr(,"class")
#> [1] "lame" "numeric"
log(lamevector, 2)
#> [1] "I am lame"
#> [1] 0.000000 1.000000 1.584963 2.000000 2.321928
#> attr(,"class")
#> [1] "lame" "numeric"
log2(lamevector)
#> [1] "I am lame"
#> [1] 0.000000 1.000000 1.584963 2.000000 2.321928
#> attr(,"class")
#> [1] "lame" "numeric"

我不确定它为什么会这样发送。组泛型有点奇怪,发送到 oldClass而不是 class ,这可能是也可能不是问题的一部分。这可能只是一个错误。其他 Math 中使用了剥离和重新添加类的习语方法,可能是因为这个原因:

MASS:::Math.fractions
#> function (x, ...)
#> {
#> x <- unclass(x)
#> fractions(NextMethod())
#> }
#> <bytecode: 0x7ff8782a1558>
#> <environment: namespace:MASS>

关于r - 为新类定义 S3 "Math"组泛型时出现意外的 log2 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52043488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com