【问题标题】:Using callNextMethod() within accessor function in R在 R 的访问器函数中使用 callNextMethod()
【发布时间】:2014-09-12 13:25:56
【问题描述】:

这与下面的帖子Problems passing arguments with callNextMethod() in R有关

我正在为两个 S4 类“foo”和“bar”编写访问器。 'bar' 继承自 foo 并且仅扩展了几个插槽。我不想为类“bar”的对象编写完整的访问器函数,而是在访问由“foo”继承的插槽时将参数传递给 callNextMethod()。我的代码如下所示:

foo <- setClass("foo", representation(x = "numeric", y = "numeric"))
bar <- setClass("bar", representation(distance = "numeric"), contains = "foo")

setMethod("[", "bar", function(x, i, j, drop) {
  if (i == "distance") {
    return(x@distance)
    } else {
      callNextMethod()
    }
}
)

setMethod("[", "foo", function(x, i, j, drop) {
  if (i == "x") {
    return(x@x)
    } else {
      if (i == "y") {
        return(x@y)
      }
    }
}
)

现在让我们试试这个:

f <- new("foo", x = 1, y = 2)
b <- new("bar", x = 3, y = 4, distance = 5)
f["x"]
f["y"]

类 'foo' 的对象 'f' 的访问器正确返回:

> f["x"]
[1] 1
> f["y"]
[1] 2

如果我尝试访问类“bar”的对象“b”的槽“距离”,访问器也会正确返回:

> b["distance"]
[1] 5

当我尝试访问从 'foo' 继承的类 'bar' 的对象 'b' 的任何插槽时,就会出现问题。如果我尝试:

b["x"]
b["y"]

我收到以下错误消息:

Error in callNextMethod() : bad object found as method (class “function”)

我已阅读这篇文章 Problems passing arguments with callNextMethod() in R 的建议,但我无法为 '[' 定义泛型,并且尝试将参数显式传递给 callNextMethod() 也失败了。

我肯定做错了什么!我已经阅读了一些关于继承的资源,但无法确定问题所在,希望你们能够指导我走向正确的方向。

谢谢

最大

【问题讨论】:

  • 通过查看callNextMethod 的源代码,我知道“为什么”它不起作用,但考虑到您在这里的内容,我不知道为什么它不起作用。好问题!

标签: r inheritance argument-passing s4


【解决方案1】:

您的方法都省略了任何 [ 方法所需的五个形式参数之一,即省略号 (...)。

args(getGeneric("["))
# function (x, i, j, ..., drop = TRUE) 
# NULL

在两个方法定义中将其作为形式包含在内可以解决您的问题:

setMethod("[", "bar", function(x, i, j, ..., drop) {
  if (i == "distance") {
    return(x@distance)
    } else {
      callNextMethod()
    }
}
)

setMethod("[", "foo", function(x, i, j, ..., drop) {
  if (i == "x") {
    return(x@x)
    } else {
      if (i == "y") {
        return(x@y)
      }
    }
}
)

b["distance"]
# [1] 5
b["x"]
# [1] 3
b["y"]
# [1] 4

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 2017-09-13
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2020-12-02
    相关资源
    最近更新 更多