從這里的示例中,我試圖將總和作為“stepfun”類。我認為,as.stepfun是正確的選擇,但我的想法行不通。怎么了?
y1 <- c(0, 1, 2, 0)
x1 <- c(1, 2, 3)
f1 <- stepfun(x = x1, y = y1)
print(class(f1))
# [1] "stepfun" "function" # OK!!!
plot(f1)
y2 <- c(0, 1, 0)
x2 <- c(1.5, 2.5)
f2 <- stepfun(x = x2, y = y2)
plot(f2)
fs <- function(x, f1, f2) {
# y <- f1(x) f2(x) # OK
# y <- as.stepfun(x = x, y = y, ties = "ordered", right = FALSE) # does not work
# return(y) # does not work
return(f1(x) f2(x))
}
print(class(fs)) # [1] "function"
# attributes(fs) # no new information...
fm <- function(x, f1, f2) {
return(f1(x) * f2(x))
}
print(class(fm)) # [1] "function"
例如as.對于 data.frame它按預期作業:
z <- c(1, 2)
class(z) # [1] "numeric"
class(as.data.frame(z)) # [1] "data.frame"
關于內部結構 stepfun
function (x, y, f = as.numeric(right), ties = "ordered", right = FALSE)
{
if (is.unsorted(x))
stop("stepfun: 'x' must be ordered increasingly")
n <- length(x)
if (n < 1)
stop("'x' must have length >= 1")
n1 <- n 1L
if (length(y) != n1)
stop("'y' must be one longer than 'x'")
rval <- approxfun(x, y[-if (right)
n1
else 1], method = "constant", yleft = y[1L], yright = y[n1],
f = f, ties = ties)
class(rval) <- c("stepfun", class(rval))
attr(rval, "call") <- sys.call()
rval
}
uj5u.com熱心網友回復:
看起來 user2554330 關于stepfun直接從其他兩個stepfun物件創建物件是正確的,但這里有一個解決方法,以防萬一它有用:
x12 <- sort(unique(c(x1, x2)))
y12 <- f1(c(x12[1] - 1, x12)) f2(c(x12[1] - 1, x12))
fs <- stepfun(x = x12, y = y12)
更新1:
或者,如果您想從f1and創建函式f2:
fs <- function(f1, f2) {
xs <- sort(unique(c(get("x", envir = environment(f1)), get("x", envir = environment(f2)))))
ys <- f1(c(xs[1] - 1, xs)) f2(c(xs[1] - 1, xs))
return(stepfun(x = xs, y = ys))
}
plot(fs(f1, f2))
更新2:
或者對于任意長的stepfun物件串列和指定組合函式的能力:
y3 <- c(-1, 2, 1, 0)
x3 <- c(0.5, 1, 3)
f3 <- stepfun(x = x3, y = y3)
fs <- function(lf, fun) {
xs <- sort(unique(unlist(lapply(lf, function(x) get("x", envir = environment(x))))))
ys <- apply(mapply(function(f) f(c(xs[1] - 1, xs)), lf), 1, FUN = "sum")
return(stepfun(x = xs, y = ys))
}
plot(fs(list(f1, f2, f3), "sum"))
plot(fs(list(f1, f2, f3), "prod"))
uj5u.com熱心網友回復:
感謝來自@ jblood94,@ user2554330和@rbm的答案在這里,我發現,我計劃在我的情況下,用一種優雅的方式。我希望這也能幫助其他人:
par(mfrow = c(2, 2))
y1 <- c(0, 1, 2, 0)
x1 <- c(1, 2, 3)
f1 <- stepfun(x = x1, y = y1)
y2 <- c(0, 1, 0)
x2 <- c(1.5, 2.5)
f2 <- stepfun(x = x2, y = y2)
plot(f1)
plot(f2)
' .stepfun' <- function(f1, f2) {
xs1 <- get("x", envir = environment(f1))
xs2 <- get("x", envir = environment(f2))
xs <- sort(unique(c(x1, x2)))
ys <- f1(c(xs[1] - 1, xs)) f2(c(xs[1] - 1, xs))
return(stepfun(x = xs, y = ys))
}
f1 f2
print(class(f1 f2))
plot(f1 f2, main = "Sum f1 f2")
'*.stepfun' <- function(f1, f2) {
xs1 <- get("x", envir = environment(f1))
xs2 <- get("x", envir = environment(f2))
xs <- sort(unique(c(x1, x2)))
ys <- f1(c(xs[1] - 1, xs)) * f2(c(xs[1] - 1, xs))
return(stepfun(x = xs, y = ys))
}
f1 * f2
print(class(f1 * f2))
plot(f1 * f2, main = "Sum f1*f2")
par(mfrow = c(1, 1))
uj5u.com熱心網友回復:
該fs函式需要"stepfun"類,而不是它回傳的結果。但是你的fs物件不能作為一個"stepfun"物件作業,因為 R 對這些做出了假設:它們需要保留產生它們的資料的副本,等等。您可以通過查看來了解f1保留的內容ls(environment(f1))。我不知道這些物件是如何使用的,但大概是需要它們的。
編輯添加:
要打開fs到一個"stepfun"物件,你可以試試as.stepfun(fs)。但這失敗了,并顯示錯誤訊息
Error in as.stepfun.default(fs) :
no 'as.stepfun' method available for 'x'
錯誤訊息不是最好的(x是第一個引數的內部名稱,在我看來,說沒有可用的方法更有意義fs),但它說 R 不知道如何進行轉換想。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338783.html
