【问题标题】:What is the difference between new() and setClass() in R?R中的new()和setClass()有什么区别?
【发布时间】:2020-02-03 02:18:58
【问题描述】:

我很好奇 R 中 new()setClass() 之间的功能区别是什么?

我回答了另一个question,这似乎表明它们的操作方式相同,只是new() 的“限制性”可能要小得多。

【问题讨论】:

    标签: r class types s4


    【解决方案1】:

    您可以在页面顶部的说明和Value 部分中参考此链接: r documentation setClass

    来自链接:

    • 适合从类创建对象的生成器函数是 回来了,无形中。对该函数的调用会生成对 new 的调用 为班级。该调用接受任意数量的参数,这将是 传递给初始化方法。如果没有定义初始化方法 对于类或其超类之一,默认方法期望 具有插槽之一的名称且未命名的命名参数 来自所包含类之一的对象的参数。

    • 通常为生成器函数分配类的名称, 为了编程清晰。这不是要求和对象 该类也可以直接从新生成。的优点 生成器函数是一个稍微简单和清晰的调用,并且 该调用将包含类的包名称(消除 如果来自不同包的两个类具有相同的任何歧义 名称)。

    • 如果类是虚拟的,则尝试从任一类生成对象 生成器或 new() 将导致错误。

    【讨论】:

      【解决方案2】:

      这两个函数有完全不同的副作用。您需要在定义类时调用setClass。你不能只是这样做

      new("square",x=0,y=0,side=1) -> mySquare
      

      并期望 R 知道正方形是什么(你会得到一个错误,类似于“未定义的类‘正方形’”)。如果你这样做了

      setClass("square",
        slots=c(
          x="numeric",
          y="numeric",
          side="numeric"
        )
      ) -> square
      
      mySquare <- square(x=0,y=0,side=1)
      

      那么您已经定义了类square,然后可以调用函数square 来从中创建对象。此时您也可以拨打new("square",...),但效果是一样的。

      如果你想创建一个不只是将插槽名称作为参数的构造函数,那么推荐的方法是创建一个普通的函数

      createSquare <- function(r,theta,side){
        square(x=r*cos(theta),y=r*sin(theta),side=side)
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-02
        • 2018-06-04
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-31
        • 2012-12-29
        • 1970-01-01
        相关资源
        最近更新 更多