【问题标题】:Can I prevent arguments from being passed via NextMethod in R?我可以防止通过 R 中的 NextMethod 传递参数吗?
【发布时间】:2014-02-18 16:31:59
【问题描述】:

我有一个 data.frame 的子类,在子集时需要一个额外的参数。 NextMethod() 传递了额外的参数,这会产生错误,因为下一个方法既不能识别参数本身,也不能识别“点”参数。

例子:

class(Theoph) <- c('special','data.frame')
`[.special` <- function(x, i, j, drop, k, ...){
   y <- NextMethod()
   attr(y, 'k') <- k
   y
}

Theoph[1:5,k='head']

结果:

Error in `[.data.frame`(Theoph, 1:5, k = "head") : 
unused argument (k = k)

我可以让“k”在下游不可见吗?我试过删除它,定义为 NULL,只传递感兴趣的参数,编写一个包装器。由于某些非默认参数匹配规则,子集运算符[ 是一个特别困难的泛型。

【问题讨论】:

  • 您可以将设置参数调用到NexMethod,例如NextMethod(.Generic, object = x, i = i,j=j, drop = drop),但由于某种原因(我不知道),这给了我一个不可见的输出。但从流派上讲,最好尊重规则与泛型函数具有相同的参数
  • @agstudy,我之前也尝试过,但它失败了,因为似乎所有参数仍在传递。您遇到的特定故障(不仅是不可见的,而且完全没有返回值)正在发生,因为 jdrop 都丢失了,所以当您使用 drop 调用 NextMethod 时,它会默默地失败。试试NextMethod(.Generic, object=x, i=i) 看看我的意思。这一切似乎都是[ 的问题。我能够让它与普通的泛型一起正常工作。
  • @BrodieG 太棒了!感谢您的澄清。所以我猜泛型原语是泛型的一个特例......
  • @agstudy,我想是这样,但是这方面的文档非常稀少。
  • @BrodieG 是的,您可以阅读 this。显然,这方面的权威文档是 C 代码:)。就我个人而言,我很少(也许永远不会)使用它。

标签: r oop subset argument-passing


【解决方案1】:

既然在这种情况下你知道下一个方法是什么,为什么不直接调用它呢?

class(Theoph) <- c('special','data.frame')

`[.special` <- function(x, i, j, drop = TRUE, k, ...) {
  y <- `[.data.frame`(x, i, j, drop = drop)
  attr(y, 'k') <- k
  y
}

Theoph[1:5, k = 'head']

但是,我会谨慎对待这种方法,因为[ 是一个相当特殊的函数,而且我认为它实际上并没有在其参数列表中包含...。 (它看起来像在文档中,但我认为这是一个简化,它没有使用标准的 ... 对象)

【讨论】:

  • 好吧!但更一般地说,“覆盖”原始泛型方法的最佳实践是什么?我应该避免添加额外的参数并使用泛型的参数吗?
  • 嗯,基于 NextMethod 失败和缺少参数我只是假设我不能直接调用函数做同样的事情,因此我的答案很混乱。我假设......
  • @agstudy 我认为这个问题不适用于其他内部泛型,因为它们的定义通常更清晰,并且它们使用 ... 的语义也得到了更好的定义。
  • 谢谢大家的意见! @hadley:是的,我尝试直接调用下一个方法,但下游至少有三个方法,以具有非默认参数匹配的原语结尾。我最终不得不为 i、j 和 drop 捕获几乎所有缺失的组合。特别是,x[nms] 和 x[,nms] 在输出上表面上相似,但在代码中需要不同的处理。我在想“正确”的做法是使用 NextMethod,并尽可能修改该调用的环境。
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 2020-09-08
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多