在 R 中为泛型定义新方法时使用隐藏函数

问题描述 投票:0回答:1

我想创建

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)

现在可以了。但我读到,使用

:::
来利用另一个包中的隐藏函数并不是一个好的做法。据推测,它被设置为隐藏是有原因的。我这里还有其他选择吗?这是
:::
可接受的用例吗?

r function methods hidden
1个回答
0
投票

如果您只是更改默认值,请尝试

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.