【问题标题】:How to assign values to slots while creating a class in R在 R 中创建类时如何为插槽分配值
【发布时间】:2023-04-08 08:50:01
【问题描述】:

我正在尝试创建一个新类,如果未明确给出这些值,它将自动生成其插槽的值。

这是我的 setClass 代码:

TestClass <- setClass(
  "TestClass",
  slots = c( names = "character",
    values = "numeric"

            ),
  validity = function(object) {

    if (length(object@values) != length(object@names) ) {
      warning("The amount of parameter values is not equal to the amount of parameter names. All parameter values have been set to 1.")

      object@values <- rep(1, length(object@names))
    } else {
      object@values <- as.numeric(object@values)
    }
  } 
)

如果未提供值,则目标是让 TestClass 类始终为“值”槽生成 1 的向量。

当我运行代码时:

test <- TestClass(names = c("a", "b"))

我收到以下错误:

Error in validObject(.Object) : invalid class “TestClass” object: 1: 1
invalid class “TestClass” object: 2: 1
In addition: Warning message:
In validityMethod(object) :
  The amount of parameter values is not equal to the amount of parameter names. All parameter values have been set to 1.

编辑:我知道我可以在 setClass 中使用“原型”来创建我的默认值。但正如您所看到的,我正在尝试自我引用并检查为类参数提供的值是否满足某些条件,如果不满足,则通过为它们分配值来覆盖输入。

【问题讨论】:

    标签: r


    【解决方案1】:

    我想我偶然发现了来自 Hadley Wickham 的答案,但我不确定这是否与其说是一种解决方案,不如说是一种更聪明的解决方法。

    我显然可以使用new() 函数创建一个新类。然后,在new() 中使用if 语句,我可以更好地控制槽的值。

    
    TestClass <- function(names, values = NA) {
    
      if (length(values) != length(names) ) {
        warning("The amount of parameter values is not equal to the amount of parameter names. All parameter values have been set to 1.")
        values <- rep(1, length(names))
      } else {
      values <- as.numeric(values)
      }
    
      new("TestClass", names = names, values = values)
    
    }
    
    TestClass_1 <- TestClass(names = c("a", "b") )
    
    

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 2016-07-11
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多