Это может быть не лучше в большом моделировании по методу Монте-Карло, но для более простых ситуаций может быть более понятно включить диапазоны x и y в качестве атрибутов вывода из созданной функции, а не в список с созданной функцией.Таким образом, goo
является более простой фабрикой, как упоминает Давор.Вы также можете сделать результат из своей функции объектом (в данном случае используя S3), чтобы его можно было отобразить более просто.
goo <- function(inp.df) {
out.fun <- approxfun(x=inp.df$a, y=inp.df$b, yright=max(inp.df$b),
method="linear", f=1)
xmax <- inp.df$a[5]
ymax <- inp.df$b[5]
function(...) {
structure(data.frame(x=x, y = out.fun(...)),
limits=list(x=xmax, y=ymax),
class=c("goo","data.frame"))
}
}
plot.goo <- function(x, xlab="x", ylab="approx",
xlim=c(0, attr(x, "limits")$x),
ylim=c(0, attr(x, "limits")$y),
lwd=2, col="red", ...) {
plot(x$x, x$y, type="l", xlab=xlab, ylab=ylab,
xlim=xlim, ylim=ylim, lwd=lwd, col=col, ...)
}
Затем, чтобы сделать функцию для фрейма данных, вы должны сделать:
df <- data.frame(a=c(1, 2, 3, 4, 5), b=c(4, 3, 1, 2, 6))
goodf <- goo(df)
И чтобы использовать его на векторе, вы должны сделать:
x <- seq(1, 4.3, 0.01)
goodfx <- goodf(x)
plot(goodfx)