我有一个名为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)
答案 0 :(得分:12)
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
。然后使用"foo"
。解决方案(1)似乎更简单,"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
的定义,以便他们使用这种方法:
class CharacterSequence {
private:
static int size;
char *sequence;
public:
CharacterSequence(int s) {
size = s;
sequence = new char[size];
}
~CharacterSequence(){
delete []sequence;
};