R模式修改传递给泛型函数的参数

时间:2015-12-29 14:11:16

标签: r oop

我有一个名为foo的通用函数。它在类barbaz上的运行方式不同,但有一些共享预处理只需要执行一次。实现这一目标的惯用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 个答案:

答案 0 :(得分:12)

1)在实际通用之上的图层foo更改foo以执行初步代码并调用foo_新的通用,如图所示。分别将foo.barfoo.baz重命名为foo_.barfoo_.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"的情况下,bNextMethod。然后使用"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

测试一下,注意我们已经更改了ba <- 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;
};