我想创建
mesh3d
S3 对象类的新子类,以及 rgl::shade3d
的相应方法。新方法将紧密模仿现有的 shade3d
函数,但具有不同的默认值。这是我最初尝试的:
library(rgl)
# Create a test object
obj <- translate3d(tetrahedron3d(col = "red"), 0, 0, 0)
# Create a new S3 subclass
obj <- structure(obj, class = c("myclass", "mesh3d", "shape3d"))
# Creating a shade3d method for myclass
shade3d.myclass <- function(mesh, ...) {
shade3d(mesh, ..., lit = F)
}
shade3d(obj)
# Error: C stack usage 15923488 is too close to the limit
据我所知,这是因为该函数尝试调用自身。为了防止这种情况,我需要指定我的函数中引用的方法。
methods(shade3d)
# [1] shade3d.mesh3d* shade3d.myclass shade3d.shapelist3d*
shade3d.myclass <- function(mesh, ...) {
rgl:::shade3d.mesh3d(mesh, ..., lit = F)
}
shade3d(obj)
现在可以了。但我读到,使用
:::
来利用另一个包中的隐藏函数并不是一个好的做法。据推测,它被设置为隐藏是有原因的。我这里还有其他选择吗?这是 :::
可接受的用例吗?
如果您只是更改默认值,请尝试
NextMethod
。
# Creating a shade3d method for myclass
shade3d.myclass <- function(mesh, ...) {
NextMethod(mesh, ..., lit = FALSE)
}
或者更好的是,用户友好并在函数定义中设置默认值。
# Creating a shade3d method for myclass
shade3d.myclass <- function(mesh, ..., lit = FALSE) {
NextMethod(mesh, ..., lit = lit)
}