如何对R语言两个stepfun类阶梯函数求和并保留stepfun类属性
问题原因
- R标准stats包中仅提供了
stepfun()构造函数,不存在as.stepfun转换方法,你调用的无效方法自然无法得到正确结果 - 阶梯函数(stepfun)是S3类,实例需要同时存储阶梯节点、各区间取值两类信息,无法像
as.data.frame转换向量一样直接通过单组计算结果生成 - 你定义的
fs、fm只是普通自定义函数,没有配置stepfun类对应的属性结构,所以类属性仅为function
解决方法
两个阶梯函数做算术运算后仍为阶梯函数,运算后的所有阶梯节点是两个原函数所有阶梯节点的并集,将其按升序去重后,逐区间计算运算结果,再调用原生stepfun()函数构造新的阶梯函数即可。
求和实现代码
# 沿用你已定义的f1、f2 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) # 合并两个函数的所有阶梯节点,去重后升序排列 x_new <- sort(unique(c(x1, x2))) # 生成各区间的求值点:第一个点取最左区间,后续点取各阶梯节点右侧,避开边界判定问题 eval_points <- c(min(x_new) - 1, x_new + 1e-9) # 逐区间计算求和结果,长度自动为length(x_new)+1,符合stepfun参数要求 y_new <- f1(eval_points) + f2(eval_points) # 构造新的stepfun对象,right参数与原函数保持一致 f_sum <- stepfun(x = x_new, y = y_new, right = FALSE) # 验证类属性 print(class(f_sum)) # 输出:[1] "stepfun" "function" # 可视化验证结果 plot(f_sum, main = "两个阶梯函数的和")
乘法实现
逻辑和求和完全一致,仅需替换运算逻辑即可:
y_mul <- f1(eval_points) * f2(eval_points) f_mul <- stepfun(x = x_new, y = y_mul, right = FALSE) print(class(f_mul)) # 输出:[1] "stepfun" "function"
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

