可以采用不同公式和数值向量作为参数的 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)
您可以进行一些调整。
- 使用
do.call(f, list(x, y))
与 f(x, y)
相同,因此您 可以 使用它,但是...
- ...您可能根本不想在对象创建期间调用该函数,因为那样只会创建一个您似乎不使用的未命名数据成员。
- 您需要为
print
方法保留一份函数 f
的副本。您可以将函数存储为函数。
- 最好命名对象的元素,并将其包装在
structure
中以正确应用 class 属性。
- 要访问
print
方法中的对象,您需要使用 $
或 [[
运算符引用它们
- 你只需要调用
plot
,而不是plot.chart
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 创建
请帮助我使我的代码工作。在这里,我尝试创建一个 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)
您可以进行一些调整。
- 使用
do.call(f, list(x, y))
与f(x, y)
相同,因此您 可以 使用它,但是... - ...您可能根本不想在对象创建期间调用该函数,因为那样只会创建一个您似乎不使用的未命名数据成员。
- 您需要为
print
方法保留一份函数f
的副本。您可以将函数存储为函数。 - 最好命名对象的元素,并将其包装在
structure
中以正确应用 class 属性。 - 要访问
print
方法中的对象,您需要使用$
或[[
运算符引用它们 - 你只需要调用
plot
,而不是plot.chart
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 创建