gpt4 book ai didi

r - 来自python背景的R中的类

转载 作者:行者123 更新时间:2023-12-03 13:18:20 25 4
gpt4 key购买 nike

我是一名 Python 程序员,这是我使用 R 的第一天。

我正在尝试使用构造函数和三个方法编写一个类,但我很挣扎。

在 python 中,这很容易:

 class MyClass:
def __init__(self):
self.variableA = 1
self.variableB = 2

def hello(self):
return "Hello"

def goodbye(self):
return "Goodbye"

def ohDear(self):
return "Have no clue"

我找不到任何能告诉我如何在 R 中做如此简单的事情的东西。如果有人能告诉我一种方法,我将不胜感激?

非常感谢

最佳答案

R 实际上有很多不同的面向对象的实现。三个原生的(如@jthetzel 提到的)是 S3、S4 和引用类。

S3 是一个轻量级系统,允许您根据第一个参数的类重载函数。

引用类被设计成更接近于其他编程语言的类。它们或多或少地取代了 S4 类,后者做同样的事情,但以更笨重的方式。

R.oo包提供了另一个系统,proto包允许面向原型(prototype)的编程,类似于轻量级 OOP。 OOP 中有第六个系统。包,但现在已经不存在了。最近的R6"is a simpler, faster, lighter-weight alternative to R's built-in reference classes" .

对于新项目,您通常只想使用 S3 和 Reference 类(或者可能是 R6)。

python 类最容易转换为引用类。它们相对较新,(直到约翰钱伯斯完成他的书)最好的引用是 ?ReferenceClasses 页。这是一个让您入门的示例。

要定义一个类,请调用 setRefClass .第一个参数是类的名称,按照惯例,这应该与您将结果分配给的变量相同。您还需要通过list s 到参数“字段”和“方法”。

有一些怪癖。

  • 如果您不想指定字段应具有的变量类型,请将“ANY”作为字段列表中的值传递。
  • 任何构造函数逻辑都需要在一个名为 initialize 的可选函数中。 .
  • 如果方法的第一行是字符串,则将其解释为该方法的文档。
  • 在方法内部,如果要分配给字段,请使用全局分配 (<<-)。

  • 这将创建一个类生成器:
    MyClass <- setRefClass(
    "MyClass",
    fields = list(
    x = "ANY",
    y = "numeric",
    z = "character"
    ),
    methods = list(
    initialize = function(x = NULL, y = 1:10, z = letters)
    {
    "This method is called when you create an instance of the class."
    x <<- x
    y <<- y
    z <<- z
    print("You initialized MyClass!")
    },
    hello = function()
    {
    "This method returns the string 'hello'."
    "hello"
    },
    doubleY = function()
    {
    2 * y
    },
    printInput = function(input)
    {
    if(missing(input)) stop("You must provide some input.")
    print(input)
    }
    )
    )

    然后通过调用生成器对象来创建类的实例。
    obj1 <- MyClass$new()
    obj1$hello()
    obj1$doubleY()

    obj2 <- MyClass$new(x = TRUE, z = "ZZZ")
    obj2$printInput("I'm printing a line!")

    进一步阅读: OO field guide高级 R 的章节。

    关于r - 来自python背景的R中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561284/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com