可以采用不同公式和数值向量作为参数的 S3 模板

S3 template which can take different formulas and numeric vectors as arguments

请帮助我使我的代码工作。在这里,我尝试创建一个 S3 模板,它可以将不同的公式和数字向量作为参数。我还想添加一个 plot 方法,绘制结果图。现在它抛出一个错误:

Error in do.call(f, list(x, y)) : 'what' must be a function or character string

这里如何正确使用do.call?

# template
chart <- function(x, y, f, ...) {
list(x, y,
do.call(f, list(x, y)),
class = "myChart")
}

# plot method
plot.myChart <- function(obj, ...) {
persp(x, y, z = outer(x, y, f))
}

# new object
c <- chart(seq(-6, 6, length = 100),
seq(-6, 6, length = 100),
f=sqrt(x^2+y^2))
c
plot.myChart(c)

您可以进行一些调整。

  1. 使用 do.call(f, list(x, y))f(x, y) 相同,因此您 可以 使用它,但是...
  2. ...您可能根本不想在对象创建期间调用该函数,因为那样只会创建一个您似乎不使用的未命名数据成员。
  3. 您需要为 print 方法保留一份函数 f 的副本。您可以将函数存储为函数。
  4. 最好命名对象的元素,并将其包装在 structure 中以正确应用 class 属性。
  5. 要访问 print 方法中的对象,您需要使用 $[[ 运算符引用它们
  6. 你只需要调用plot,而不是plot.chart
  7. f 在对象创建期间需要是一个函数。您正在传递函数 call.
chart <- function(x, y, f, ...) {
  structure(list(x = x, y = y, f = f), class = "myChart")
}

# plot method
plot.myChart <- function(obj, ...) {
  persp(obj$x, obj$y, z = outer(obj$x, obj$y, obj$f), ...)
}

# new object
ch <- chart(x = seq(-6, 6, length = 100),
            y = seq(-6, 6, length = 100),
            f = function(x, y) sqrt(x^2 + y^2))

plot(ch)

reprex package (v2.0.1)

于 2022-05-10 创建