我有一个称为的通用函数foo
。它在类上的操作不同bar
,baz
但是有一些共享的预处理只需要执行一次。R的惯用方式是什么?
在下面的愚蠢示例中,我想将传递给泛型的对象乘以10。但是,当调用该方法时,原始值将打印到控制台。我已经阅读了语言定义,并且知道以下模式不起作用。我的问题是:在调用方法之前,应在哪里或应如何处理通用参数的共享处理?
a <- structure(1:5, class="bar")
b <- structure(6:10, class="baz")
foo <- function(x) {
x <- x * 10 # where should shared preprocessing go?
UseMethod("foo")
}
foo.bar <- function(x) {
cat("Foo!", x)
}
foo.baz <- function(x) {
cat("Baz!", x)
}
# does not propagate the operations carried out `foo`
foo(a)
foo(b)
1)在实际通用更改之上的foo层foo
执行初始代码并调用foo_
新的通用,如图所示。重命名foo.bar
,并foo.baz
以foo_.bar
和foo_.baz
分别让我们剩下的(也加入了新行的例子):
foo <- function(x) {
x <- x * 10
foo_(x)
}
foo_ <- function(x) UseMethod("foo_")
foo_.bar <- function(x) cat("Foo!", x, "\n")
foo_.baz <- function(x) cat("Baz!", x, "\n")
现在测试一下:
a <- structure(1:5, class="bar")
b <- structure(6:10, class="baz")
foo(a)
## Foo! 10 20 30 40 50
foo(b)
## Baz! 60 70 80 90 100
有关在广泛使用的程序包中的示例,请参见dplyr :: mutate的源代码。
2)NextMethod另一种方法是给每一个对象两个类的类矢量与"foo"
由子类"bar"
中的情况下a
和"baz"
在的情况下b
。然后使用NextMethod
。解决方案(1)似乎简单,它可能看起来奇怪的是"foo"
是两者的子类"bar"
和"baz"
但这里是这一个以防万一的例子:
foo <- function(x) UseMethod("foo")
foo.foo <- function(x) {
x <- x * 10
NextMethod()
}
foo.bar <- function(x) cat("Foo!", x, "\n")
foo.baz <- function(x) cat("Baz!", x, "\n")
测试一下,注意我们已经更改了a
和的定义,b
以便它们可以使用此方法:
a <- structure(1:5, class= c("foo", "bar"))
b <- structure(6:10, class = c("foo", "baz"))
foo(a)
## Foo! 10 20 30 40 50
foo(b)
## Baz! 60 70 80 90 100
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句