You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Weibull分布成本率计算函数调用报错排查

问题分析与解决方案

首先,你的报错原因完全命中了你的猜测——内部定义的cum、survival函数,尤其是用于积分的cycle_length,没有正确获取到外部函数CR_age中的lambda和k参数。

具体来说,问题出在integrate(cycle_length, 0, T)这一行:你用Vectorize(survival, "T")生成了cycle_length,但这个向量化后的函数只被设置为接收T参数。当integrate调用它时,只会传入积分区间内的T值,完全没传递lambda和k,而survival本身需要这三个参数,所以R会提示lambda缺失。

下面给你两种可行的修正方案:

方案1:让内部函数直接捕获外部参数

修改内部的cum和survival函数,去掉参数列表里的lambda和k,让它们直接从CR_age的函数环境中读取这两个参数:

CR_age <- function(T,lambda,k,cpm,ccm) {
  cum <- function(T) {
    return(1 - exp((-T/lambda)^k))
  }
  survival <- function(T) {
    return(exp((-T/lambda)^k))
  }
  mean_cost <- ccm * cum(T) + cpm * survival(T)
  cycle_length <- Vectorize(survival, "T")
  mean_cycle_length <- integrate(cycle_length, 0, T)
  costRate <- mean_cost / mean_cycle_length$value
  return(costRate)
}

方案2:调用integrate时显式传递额外参数

如果你想保留内部函数的完整参数列表,那可以在调用integrate时,通过...参数把lambda和k传递给cycle_length:

CR_age <- function(T,lambda,k,cpm,ccm) {
  cum <- function(T,lambda,k) {
    return(1 - exp((-T/lambda)^k))
  }
  survival <- function(T,lambda,k) {
    return(exp((-T/lambda)^k))
  }
  mean_cost <- ccm * cum(T,lambda,k) + cpm * survival(T,lambda,k)
  cycle_length <- Vectorize(survival, "T")
  # 这里添加lambda和k作为额外参数传递给cycle_length
  mean_cycle_length <- integrate(cycle_length, 0, T, lambda=lambda, k=k)
  costRate <- mean_cost / mean_cycle_length$value
  return(costRate)
}

现在你再调用CR_age(2,0.1,1,3,1),就可以正常计算成本率了。

内容的提问来源于stack exchange,提问作者Deng Cheng Long

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:14