使用OOP和S3方法进行检测,然后对单个向量或data.frame的所有列进行操作

使用OOP和S3方法进行检测,然后对单个向量或data.frame的所有列进行操作,r,r-s3,R,R S3,我写了一个在单个向量上运行的函数。有时我想在整个data.frame上使用该函数。我可以通过在相关变量之间使用sapply来实现这一点,但现在我希望使用S3方法来包含和指导函数 首先,设置: df_test <- data.frame(x = c(1, 2, 3, 4, 5), y = c(6, 7, 8, 9, 10), z = c(11, 12, 13, 14, 15)) adder <

我写了一个在单个向量上运行的函数。有时我想在整个
data.frame
上使用该函数。我可以通过在相关变量之间使用
sapply
来实现这一点,但现在我希望使用S3方法来包含和指导函数

首先,设置:

df_test <- data.frame(x = c(1, 2, 3, 4, 5), 
                      y = c(6, 7, 8, 9, 10), 
                      z = c(11, 12, 13, 14, 15))

adder <- function(x, from, to) {
  if(is.null(ncol(x))) {
    x <- structure(list(x = x, from = from, to = to), class = "single")
  } else {
    x <- structure(list(x = x, from = from, to = to), class = "multiple")
  }
  UseMethod("adder", x)
}

adder.single <- function(x, from, to) {
  x <- x + (from - to) # just some random operation here - the real function does more
  x
}

adder.multiple <- function(x, from, to) {
  x <- sapply(x, function(y) { 
    y <- structure(list(x = y, from = from, to = to), class = "single"); 
    UseMethod("adder", y) })
  x
}
但是传递整个
data.frame
不会:

> adder(df_test, 2, 4)
Error in from - to : 'from' is missing
我很清楚问题是什么-
加法器检测到我们正在查看整个
数据。frame
,使用“multiple”方法,然后调用“single”方法,参数
from
to
没有被传递


我读过哈德利·维克姆和尼古拉斯·克里斯蒂安的《哈利·维克姆》但我看不懂。我欢迎一种完全不同的方法,只要它使用S3方法,因为本练习的一部分是让我学习如何使用它们。

只需调用
加法器
,S3调度将正确地执行并调用正确的函数

adder.multiple <- function(x, from, to) {
  sapply(x,  adder,from,to)
}

adder.multiplenice。另外,我猜OP打算使用
NextMethod
而不是
usethod
,尽管在这种情况下,由于结构怪异(
multiple
实际上并不是从
single
继承的),尽管乍一看似乎是这样。谢谢。我知道这必须更容易@BrodieG-我不打算使用
NextMethod
,但这是更好的方法吗?另外,
multiple
应该如何继承
single
?我现在正在学习如何以这种方式使用R,所以我愿意学习正确的方法来组织我的程序。@christianlemp,为了使
multiple
继承自
single
,它必须有class
c(“multiple”,“single”)
(即它实际上是两个类);这在您的设置中是不可能的
NextMethod
仅在对象包含多个类的情况下有效。
adder.multiple <- function(x, from, to) {
  sapply(x,  adder,from,to)
}