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

开发EM算法时遇R语言报错:object of type 'closure' is not subsettable

问题修复方案

核心错误原因

  1. 函数名与R内置常量冲突:你将CDF函数命名为F,但F是R的内置逻辑常量(等价于FALSE),这会导致调用时出现类型混淆,触发object of type 'closure' is not subsettable错误。
  2. 未定义变量frame:Aa函数中直接使用frame$y[j],但frame未被定义或传入函数,无法访问样本数据。
  3. 函数依赖全局变量:Aa函数依赖全局环境中的数据,不符合函数封装原则,易引发变量作用域问题。

具体修复步骤

1. 重命名CDF函数

将原CDF函数F改为F_IPLE,避免与内置常量冲突:

# 修改后的CDF OF IPLE DISTRIBUTION
F_IPLE <- function(alpha,beta,lambda,x){
  y=1/((exp(lambda/(x)^beta)-1)^alpha +1)
  return(y)
}

2. 定义样本数据变量

调用bl生成样本后,将结果赋值给frame:

n<-40
m<-10
par<-c(0.5,0.45,0.2)
# 生成样本并赋值给frame
frame <- bl(n,m,par)

3. 修改Aa函数,传入样本数据参数

修改Aa函数,新增data参数接收样本数据,替换原frame的使用,并更新CDF函数调用为F_IPLE:

# 修改后的积分函数
Aa <- function(par, m, data){
  alpha <- par[[1]]
  beta <- par[[2]]
  lambda <- par[[3]]
  y <- numeric(m)  # 预分配内存更高效
  c_vec <- numeric(m)
  for(j in 1:m){
    # 使用传入的data参数,调用重命名后的CDF函数
    c_vec[j] <- 1/(1 - F_IPLE(alpha,beta,lambda, data$y[j]))
    g <- function(x){
      log(x)*f(alpha,beta,lambda,x)
    }
    y[j] <- c_vec[j] * integrate(g, lower = data$y[j], upper=Inf)$value  
  }
  return(y)
}

4. 正确调用Aa函数

传入生成的样本数据:

Aa(par, m, frame)

修改后的完整代码示例

# The PDF of IPLE distribution
f <- function(alpha,beta,lambda,x){
  y=alpha*beta*lambda*(x)^(-beta-1)*exp((lambda/(x)^beta))*(exp((lambda/(x)^beta))-1)^(alpha-1)*((exp(lambda/(x)^beta)-1)^alpha +1)^(-2)
  return(y)
}

# 修改后的CDF OF IPLE DISTRIBUTION
F_IPLE <- function(alpha,beta,lambda,x){
  y=1/((exp(lambda/(x)^beta)-1)^alpha +1)
  return(y)
}

# GENERATING PROGRESSIVE TYPE II CENSORED SAMPLE
bl <- function(n,m,par){
  alpha=par[[1]]
  beta=par[[2]]
  lambda=par[[3]]
  regw<-function(x,aalpha=alpha,bbeta=beta,llambda=lambda){
    q=llambda^(1/bbeta)*(log(((1/x)-1)^(1/aalpha)+1))^(-(1/bbeta))
    return(q)}
  w=runif(m)
  r=c()
  r[1]=rbinom(1,n-m,0.2)
  int=seq(2,m-1)
  s=r[1]
  for(i in int){
    r[i]=rbinom(1,n-m-s,0.2)
    s=s+r[i]}
  if(n-m-s>0)
    r[m]=n-m-s
  else
    r[m]=0
  p=c()
  x=c()
  v=c()
  u=c()
  y=c()
  p=r[m]
  for (i in 1:m){
    v[i]=w[i]^(1/(i+p))
    p=p+r[m-i]
  }
  x=v[m]
  for (i in 1:m){
    u[i]=1-x
    x=x*v[m-i]
    y[i]=regw(u[i],alpha,beta,lambda)
  }
  D=data.frame(y,r)
  return(D)
}

n<-40
m<-10
par<-c(0.5,0.45,0.2)
# 生成样本并赋值给frame
frame <- bl(n,m,par)

# 修改后的积分函数
Aa <- function(par, m, data){
  alpha <- par[[1]]
  beta <- par[[2]]
  lambda <- par[[3]]
  y <- numeric(m)
  c_vec <- numeric(m)
  for(j in 1:m){
    c_vec[j] <- 1/(1 - F_IPLE(alpha,beta,lambda, data$y[j]))
    g <- function(x){
      log(x)*f(alpha,beta,lambda,x)
    }
    y[j] <- c_vec[j] * integrate(g, lower = data$y[j], upper=Inf)$value  
  }
  return(y)
}

# 正确调用Aa函数
Aa(par, m, frame)

内容的提问来源于stack exchange,提问作者MUIA DOMINIC MUTISO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:31:12