【发布时间】:2020-02-03 02:18:58
【问题描述】:
我很好奇 R 中 new() 和 setClass() 之间的功能区别是什么?
我回答了另一个question,这似乎表明它们的操作方式相同,只是new() 的“限制性”可能要小得多。
【问题讨论】:
我很好奇 R 中 new() 和 setClass() 之间的功能区别是什么?
我回答了另一个question,这似乎表明它们的操作方式相同,只是new() 的“限制性”可能要小得多。
【问题讨论】:
您可以在页面顶部的说明和Value 部分中参考此链接:
r documentation setClass
来自链接:
适合从类创建对象的生成器函数是 回来了,无形中。对该函数的调用会生成对 new 的调用 为班级。该调用接受任意数量的参数,这将是 传递给初始化方法。如果没有定义初始化方法 对于类或其超类之一,默认方法期望 具有插槽之一的名称且未命名的命名参数 来自所包含类之一的对象的参数。
通常为生成器函数分配类的名称, 为了编程清晰。这不是要求和对象 该类也可以直接从新生成。的优点 生成器函数是一个稍微简单和清晰的调用,并且 该调用将包含类的包名称(消除 如果来自不同包的两个类具有相同的任何歧义 名称)。
如果类是虚拟的,则尝试从任一类生成对象 生成器或 new() 将导致错误。
【讨论】:
这两个函数有完全不同的副作用。您需要在定义类时调用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)
}
【讨论】: