【发布时间】: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,我之前也尝试过,但它失败了,因为似乎所有参数仍在传递。您遇到的特定故障(不仅是不可见的,而且完全没有返回值)正在发生,因为
j和drop都丢失了,所以当您使用drop调用NextMethod时,它会默默地失败。试试NextMethod(.Generic, object=x, i=i)看看我的意思。这一切似乎都是[的问题。我能够让它与普通的泛型一起正常工作。 -
@BrodieG 太棒了!感谢您的澄清。所以我猜泛型原语是泛型的一个特例......
-
@agstudy,我想是这样,但是这方面的文档非常稀少。
-
@BrodieG 是的,您可以阅读 this。显然,这方面的权威文档是 C 代码:)。就我个人而言,我很少(也许永远不会)使用它。
标签: r oop subset argument-passing