当我运行R程序包的测试时,我得到了“ closure”类型的错误对象,它不是子集

问题描述

这是我的linreg函数,用于计算多元回归并返回RC对象。

函数将公式和数据框作为输入,并进行一些回归分析,然后返回RC类型的对象。 我将在计算结束时创建RC对象,然后返回一个新的RC对象。

  
  data_name <- deparse(substitute(data))

  X <- model.matrix(formula,data)

  y_col <- data[all.vars(formula)[1]]
  y <- as.matrix(y_col)
 
  X[is.na(X)] <- 0
  
  transpose_X <- t(X)
  
  X_tranp_inversion <- solve(transpose_X %*% X)

  beta_hat <- X_tranp_inversion %*% (transpose_X %*% y)
  
  fitted_value_y_hat <- X %*% beta_hat
  
  residuals <-  y- fitted_value_y_hat
  
  degree_freedom <- nrow(X) - ncol(X)
  
  variance_sqr <- (t(residuals) %*% residuals) / degree_freedom
  
  variance_beta <- as.vector(variance_sqr) * diag(X_tranp_inversion)
  parameters <- diag(X_tranp_inversion)
  parameters_names <- names(parameters)
  
  t_value <- NA
    
  t_value <- beta_hat/ sqrt(variance_beta)
    
  p_value <- 2*pt(-abs(t_value),degree_freedom)
  
  linreg <- setRefClass("linreg",fields = list(name = "character",data = "data.frame",parameters = "numeric",parameters_names = "character",residuals = "vector",predicted_y = "vector",coefficent = "vector")
                        )
                        
  
  linreg$methods(show = function(){
    cat("Call:\n")
    cat(paste0(.self$name,"\n"))
    cat("Coefficients:\n")
    names(.self$parameters) <- .self$parameters_names
    print(.self$parameters)
    
  })
  
  linreg$methods(initialize = function(name = "",formula_name = "",data_name = "",dataframe,param,param_names,resid,pred_y){
    #dataframe_name <- deparse(substitute(dataframe))
    .self$data <<- dataframe
    formula_vars <- as.character(formula_name)
    .self$name <<- paste0("linreg(formula = ",formula_vars[2],formula_vars[1],formula_vars[3],",data = ",data_name,")\n")
    .self$parameters <<- param
    .self$parameters_names <<- param_names 
     names(.self$parameters) <-  parameters_names
    .self$coefficent <<- .self$parameters
    .self$residuals <<- as.vector(resid)
    .self$predicted_y <<- as.vector(pred_y)
    .self$show()
    
  })
  
  linreg$methods(plot = function(){
    ggplot2::qplot(Sepal.Length,Petal.Length,data = data)
  })
  linreg$methods(summary = function(){
    cat("i'm summary")
  })
  linreg$methods(resid = function(){
    return(.self$residuals)
  })
  linreg$methods(pred = function(){
    return(.self$predicted_y)
  })
  linreg$methods(coef = function(){
    return(coefficent)
  })
  
  
  return(linreg$new(formula_name = formula,data_name = data_name,dataframe = data,param = parameters,param_names = parameters_names,resid = residuals,pred_y = fitted_value_y_hat))
}

下面是我运行的测试用例,其他人编写了这些,但我必须通过这些测试用例

context("linreg")

data("iris")

polygon <- setRefClass("polygon",fields = c("sides"))
square <- polygon$new(sides = 4)
test_that("lenreg rejects errounous input",{
  expect_error(linreg_mod <- linreg$new(formula = Petal.Length~Sepdsal.Width+Sepal.Length,data=iris))
  expect_error(linreg_mod <- linreg$new(formula = Petal.Length~Sepdsal.Width+Sepal.Length,data=irfsfdis))
})


test_that("class is correct",{
  linreg_mod <- linreg$new(Petal.Length~Sepal.Width+Sepal.Length,data=iris)
  
  expect_true(class(linreg_mod)[1] == "linreg")
})

test_that("print() method works",data=iris)
  
  expect_output(linreg_mod$print(),"linreg\\(formula = Petal\\.Length ~ Sepal\\.Width \\+ Sepal\\.Length,data = iris\\)")
  expect_output(linreg_mod$print(),"( )*\\(Intercept\\)( )*Sepal\\.Width( )*Sepal\\.Length")
})

test_that("pred() method works",data=iris)
  
  expect_equal(round(unname(linreg_mod$pred()[c(1,5,7)]),2),c(1.85,1.53,1.09))    
})

test_that("resid() method works",data=iris)
  
  expect_equal(round(unname(linreg_mod$resid()[c(7,13,27)]),c(0.31,-0.58,-0.20))
})

test_that("coef() method works",data=iris)
  
  expect_true(all(round(unname(linreg_mod$coef()),2) %in% c(-2.52,-1.34,1.78)))
})


test_that("summary() method works",data=iris)
  
  expect_output(linreg_mod$summary(),"\\(Intercept\\)( )*-2.5[0-9]*( )*0.5[0-9]*( )*-4.4[0-9]*( )*.*( )*\\*\\*\\*")  
  expect_output(linreg_mod$summary(),"Sepal.Width( )*-1.3[0-9]*( )*0.1[0-9]*( )*-10.9[0-9]*( )*.*( )*\\*\\*\\*")
  expect_output(linreg_mod$summary(),"Sepal.Length( )*1.7[0-9]*( )*0.0[0-9]*( )*27.5[0-9]*( )*.*( )*\\*\\*\\*")
  expect_output(linreg_mod$summary(),"Residual standard error: 0.6[0-9]* on 147 degrees of freedom")
})


test_lab4.R:14:错误:类正确 类型为'closure'的对象不可子集化

我遇到上述错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...