Oop is.object和S3类系统
使用Oop is.object和S3类系统,oop,r,r-s3,r-s4,Oop,R,R S3,R S4,使用class功能可以确定对象的类别: > x = 5 > class(x) [1] "numeric" 我还了解到,我们可以使用is.object命令来确定对象是否具有类。但是,有些对象类型是隐式的,即 > is.object(x) [1] FALSE R中的所有变量都是对象,is.object只是对非隐式类的测试,这是否正确 另外,类型如何适应这种情况。我天真地认为以下代码会产生错误: > x = 5 > class(x) = "fake" > x =
class
功能可以确定对象的类别:
> x = 5
> class(x)
[1] "numeric"
我还了解到,我们可以使用is.object
命令来确定对象是否具有类。但是,有些对象类型是隐式的,即
> is.object(x)
[1] FALSE
R中的所有变量都是对象,is.object
只是对非隐式类的测试,这是否正确
另外,类型如何适应这种情况。我天真地认为以下代码会产生错误:
> x = 5
> class(x) = "fake"
> x = X + 1
> x + 1
[1] 6
attr(,"class")
[1] "fake"
但是
x
仍然有“double”类型,仍然一切正常。类型可以被认为是所有其他对象继承自的超类吗?第一个问题的部分答案见R语言定义的第2章
R不提供对数据的直接访问
计算机的内存
提供了一些专门的数据
我们将称之为
物体。这些对象是指
通过符号或变量。在R中,
然而,这些符号本身就是
对象,并且可以在
和其他物体一样
所以,是的,所有变量都是对象
is.object
似乎或多或少等同于函数(x)!is.null(attr(x,“class”))
但我愿意在这方面被证明是错误的
至于第二个问题,我认为会发生这样的情况:
由于
x
有类“fake”,因此R在加法中查找方法+.fake
,但如果找不到,则使用默认方法。默认方法基于底层C代码,它使用typeof(x)
(或C等价物)来确定应该做什么。在这种情况下,x
的类型是“整数”。typeof
返回内部C表示的类型,它不用于方法分派。所以严格地说,你不能把类型看作是“超类”
相反,有一些基本类(数字类、字符类、列表类、函数类等)与名称大致对应
由typeof
返回,但并不总是如此(例如,类型double属于numeric类,特殊类型和闭包属于class类)
函数,类data.frame的类型为list!)
对于S3和S4系统,您可以使用基本类(但不必扩展其中一个!!例如:setClass(“foo”,list(a=“numeric”,b=“character”)
不扩展任何基本类
对于这些基本类中的对象,is.object
返回FALSE
检查对象是否属于用户构建S3或S4类(即不是基本类之一)的一种非常快速的方法
将x
转换为“假”后,您的对象正式不属于“数字”类:
但它可以解释为基本的“数字”对象:
这就是+
在这里工作的原因。因此,在内部,@Richie已经说过,默认方法将x
解释为
数字基类
这种概念混乱是因为S3对类的非正式处理。使用S4代替
(.)和基本类(.)之间的对应关系:
typeof(.)class(.)
空“空”空“空”
1“双”“数字”
1:1“整数”“整数”
1i“复杂”“复杂”
列表(1)“列表”“列表”
data.frame(x=1)“列表”data.frame
pairlist(pi)“pairlist”“pairlist”
c“特殊”功能
lm“闭包”函数
格式(lm)[[1]]“符号”“名称”
格式(lm)[[2]]符号“名称”
y~x“语言”“公式”
表达式((1))[[1]]“语言”(“
(y~x)[[1]]符号“名称”
表达式(x)虽然有一个s4标记,但没有s3标记。有人会创建一个s3标记吗?我认为重新标记就足够了,看起来没有:-(s3显然是amazon-s3的同义词。我问了一个关于meta的问题:它比那个复杂一点。关键是搜索内部泛型。不在手机上时会写更多的内容4引入了它自己的一系列问题。我不认为在不了解更多问题的情况下建议使用S4而不是s3是好的m、 @hadley根据我的经验,S4的问题主要来自混乱和不透明的实现——它充满了内部解决方法和补丁。这通常会导致意外的结果,我个人对此也很厌倦。该系统本身模仿了公认的最灵活和最健壮的通用Lisp对象系统之一对象方向。此外,R变得越来越像S4,这是使用S4而不是S3的一个很好的理由。c
应该是内置函数,而不是特殊函数:用typeof(c)
检查它。
is(x, "numeric")
#FALSE
is.numeric(x)
#TRUE
typeof(.) class(.)
NULL "NULL" "NULL"
1 "double" "numeric"
1:1 "integer" "integer"
1i "complex" "complex"
list(1) "list" "list"
data.frame(x=1) "list" "data.frame"
pairlist(pi) "pairlist" "pairlist"
c "special" "function"
lm "closure" "function"
formals(lm)[[1]] "symbol" "name"
formals(lm)[[2]] "symbol" "name"
y~x "language" "formula"
expression((1))[[1]] "language" "("
(y~x)[[1]] "symbol" "name"
expression(x <- pi)[[1]][[1]] "symbol" "name"