Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop is.object和S3类系统_Oop_R_R S3_R S4 - Fatal编程技术网

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"