> attr(a,'class') <- 'foo' # 用 attr( ) 函数将 a 的类指定为 foo > class(a) [1] "foo" > attr(b,'class')<-c('baz','bam','bar') # 指定 b 的属于三个类 'baz','bam','bar' >

Similar documents
OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

无类继承.key

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Guava学习之Resources

1.加入党组织主要经过哪些程序?

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

材 料 目 录 1. 党 员 发 展 及 转 正 流 程 图 2. 申 请 入 党 人 员 基 本 信 息 及 培 养 记 录 表 3. 思 想 汇 报 传 阅 及 意 见 反 馈 表 4. 入 党 积 极 分 子 培 养 考 察 表 5. 政 治 审 查 函 调 信 模 板 6. 政 治 审 查

Microsoft Word - 新1-12.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

土 木 与 交 通 学 院 发 展 学 生 党 员 的 选 拨 条 件 与 推 荐 细 则 为 进 一 步 规 范 我 院 学 生 党 建 工 作, 加 强 和 完 善 我 院 对 学 生 党 员 各 个 阶 段 人 员 的 选 拔 和 培 养 工 作, 提 高 我 院 发 展 学 生 党 员 质

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

R 软件介绍 (3): R编程基础

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

重 庆 市 万 州 区 人 民 政 府 公 报 卷 首 语 开 启 加 快 建 设 重 庆 第 二 大 城 市 新 征 程 1 万 州 区 委 区 政 府 文 件 传 达 政 令 宣 传 政 策 指 导 工 作 服 务 全 区 中 共 重 庆 市 万 州 区 委 重 庆 市 万 州 区 人 民 政

2/80 2

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx


安徽电子工程学校

软件测试(TA07)第一学期考试

投影片 1

R 软件介绍 (3): R编程基础

2013年度西藏自治区教育厅

實用文格式大全.doc

薛 秦 高 继 宁 宋 明 锁 文 洪 梁 瑞 敏 贾 跃 进 内 蒙 古 自 治 区 (3 人 ) 琪 格 其 图 米 子 良 赵 震 生 辽 宁 省 (8 人 ) 田 素 琴 白 凤 鸣 肖 瑞 崇 黄 恩 申 白 长 川 杨 世 勇 李 敬 林 王 秀 云 吉 林 省 (5 人 ) 赵 继 福

个 小 小 的 乡 下 人 木 匠 的 儿 子, 竟 然 有 这 么 大 的 力 量 其 实 就 是 这 点, 祂 活 出 来 的 那 种 爱, 是 世 界 上 没 有 的 祂 活 出 来 的 爱 是 世 界 上 的 人 都 需 要 的, 但 却 是 人 人 在 这 个 世 界 上 都 得 不 到

科学计算的语言-FORTRAN95

目 录 专 稿 季 烨 文 革 之 初 北 京 师 大 二 附 中 的 红 色 暴 力 姜 培 良 之 死 与 仇 恨 教 育 评 论 唐 燕 关 于 北 京 女 十 中 教 师 孙 迪 之 死 给 王 友 琴 纠 错 校 史 王 逸 伦 编 辑 合 肥 市 第 六 中 学 校 史 关 于 文 革

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

来 正 式 组 织 关 系 转 出 后 未 收 到 组 织 关 系 介 绍 信 回 执 的 党 员 排 查 的 主 要 任 务 是, 核 查 党 员 身 份 信 息, 摸 清 流 动 党 员 底 数, 理 顺 党 员 组 织 关 系, 健 全 完 善 党 员 档 案, 对 与 党 组 织 失 去 联

《C语言程序设计》教材习题参考答案

生命科学学院 学年度学风建设实施方案


软件工程文档编制

epub83-1

第二章

邻居啊 第二天 对门却悄无声息了 莫非昨夜的吵闹 仅是个幻觉 夜幕拉下时 寒风又吱溜溜地叫个不停 老婆 睡下后 我这只夜猫子 继续兴致勃勃地跟着福尔 摩斯去探案 白天的喧嚣退去了 周围格外安静 正 是读书的好时候 突然 响起了钟摆声 哒 哒 哒 节奏匀称 不疾不徐 声响却愈来愈大 格外突兀 了 原来

<4D F736F F D BAC520CAD7B6BCCAA6B7B6B4F3D1A C4EAD7A8D2B5BCBCCAF5D6B0CEF1C6C0C6B8B9A4D7F7D2E2BCFB2E646F63>

其 他 方 面 也 可 以 采 用 同 样 的 方 式, 这 样 又 可 以 锻 炼 除 语 文 方 面 的 其 他 能 力 了 而 英 语 方 面, 我 认 为 配 合 英 语 专 业 举 办 英 语 演 讲 比 赛 就 很 不 错 这 样 开 展 一 系 列 的 创 新 活 动, 锻 炼 多 方

<4D F736F F D A67EABD7A4BAB3A1B1B1A8EEA8EEABD7A6DBA6E6B5FBA6F4AD70B5652E646F63>

统计工作情况汇报

Microsoft Word - 送報伕2.doc

Microsoft Word - N011 斷翅天使

中 国 科 学 院 国 家 科 学 图 书 馆

申论写作套路万能模板

Microsoft Word - 三方协议书与接收函的相关说明学生版.doc

第 六 条 办 法 第 五 条 ( 三 ) 协 会 考 评, 考 评 指 考 核 评 价 第 七 条 办 法 第 六 条 职 业 操 守 包 括 的 内 容 : 个 人 诚 信 不 做 假 账 不 偷 漏 税 不 贪 污 盗 窃 等 第 八 条 企 业 财 务 管 理 人 才 评 价 实 行 五 星

他 随 身 带 有 二 三 十 张 古 方, 白 天 卖 药, 夜 晚 将 药 材 精 细 研 末, 按 方 配 制 对 于 病 人 服 药 后 反 应, 特 别 留 心 发 现 问 题, 就 近 向 老 医 生 老 药 贩 虚 心 求 教, 千 方 百 提 高 药 效 同 时 对 于 春 夏 秋

目 录 第 一 章 地 方 陪 同 导 游 人 员 服 务 程 序...1 第 一 节 地 方 陪 同 导 游 人 员 的 概 念 与 职 责...1 第 二 节 服 务 准 备...2 一 熟 悉 接 待 计 划...2 二 落 实 接 待 事 宜...5 三 物 质 和 知 识 的 准 备...

走 吧, 到 三 峡 去 : 那 里 是 我 们 先 人 用 生 命 之 血 打 造 的 家 园 走 吧, 到 三 峡 去 : 那 里 的 浪 涛 承 载 过 千 百 万 只 我 们 先 人 驶 向 今 天 的 航 船 走 吧, 到 三 峡 去 : 那 里 的 每 一 座 青 山 都 刻 满 了 我

6寸PDF生成工具

( 地 ( ) 组 织 机 构 代 码 企 业 详 细 名 称 哈 密 地 伊 吾 新 疆 广 汇 新 能 源 有 限 公 司 玛 纳 斯 玛 纳 斯 祥 云 化 纤 有 限 公 司 玛 纳 斯 玛 纳 斯 澳 洋 科 技 有 限 责

图 文 聚 焦 国 培 计 划 (2013) 甘 肃 省 农 村 小 学 音 乐 骨 干 教 师 短 期 集 中 培 训 9 月 4 日 开 班 了, 学 员 老 师 们 从 甘 肃 省 各 个 县 市 州 汇 聚 湖 南 一 师, 开 始 了 为 期 14 天 的 培 训 学 习 : 鲜 明 的

申請機構基本資料

申請機構基本資料

附件1

~2~

,,

untitled

申 请 律 师 执 业 许 可 初 审 服 务 指 南 目 录 一 办 理 要 素 ( 一 ) 事 项 名 称 和 编 码 4 ( 二 ) 实 施 机 构 4 ( 三 ) 申 请 主 体 4 ( 四 ) 受 理 地 点 4 ( 五 ) 办 理 依 据 4 ( 六 ) 办 理 条 件 5 ( 七 )

环 境, 我 在 巩 固 在 校 期 间 所 学 习 的 理 论 知 识 的 同 时, 不 断 的 充 实 己, 利 用 业 余 时 间 主 动 学 习 专 业 知 识, 技 能, 把 理 论 联 系 到 工 作 实 践 中 作 为 一 名 工 作 生 活 中 的 党 员, 我 始 终 注 意 与

ENGG1410-F Tutorial 6

HKG_ICSS_FTO_sogobrilingual_100_19Feb2016_31837_tnc

要 及 时 为 入 党 积 极 分 子 确 定 两 名 培 养 联 系 人, 进 行 联 络 帮 助 要 定 期 ( 每 季 度 至 少 一 次 ) 听 取 培 养 联 系 人 的 思 想 和 工 作 情 况 汇 报, 及 时 完 成 入 党 积 极 分 子 登 记 表 ( 见 附 件 2) 的 填

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

C++ 程式設計

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

Microsoft PowerPoint - string_kruse [兼容模式]

國家圖書館典藏電子全文

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

國立嘉義高中96學年度資優班語資班成班考國文科試題

TI 3 TI TABLE 4 RANDBIN Research of Modern Basic Education

Microsoft Word - 物件導向編程精要.doc

Microsoft Word - 論文定稿2.doc


AM101-1(中文)11.cdr

文档 3

Strings

Microsoft PowerPoint - Lecture7II.ppt

EJB-Programming-3.PDF

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

运动员治疗用药豁免申报审批办法

3.1 num = 3 ch = 'C' 2

Microsoft PowerPoint - Aqua-Sim.pptx

untitled

五 食 品 安 全 要 做 到 哪 三 证 五 防? 三 证 是 食 品 流 通 许 可 证 餐 饮 服 务 许 可 证 健 康 合 格 证 五 防 是 防 鼠 防 蝇 防 尘 防 腐 防 虫 六 国 家 卫 生 县 城 的 称 号 是 永 久 性 的 吗? 国 家 卫 生 县 城 不 是 终 生


統計名詞0925

EJB-Programming-4-cn.doc


Microsoft Word - 会协(2016)16号.doc

K301Q-D VRT中英文说明书141009

Transcription:

R 学习笔记 R 中的 S4 方法 胡荣兴 hurongxing@126.com R 主要面向统计计算, 似乎很少会用到面向对象的编程方法 但在统计计算中, 在下列情形中使用面向对象的编程方法可以编程更有效率 1) 当需要用一种新的方式来表示数据, 该方式与已有的数据类型有区别的时候 2) 当需要一个新的函数, 该函数可以根据不同的参数类型做出不同的反应的时候 在 R 中, 经常需要定义一个新的函数, 并且定义一个新的函数也是一项繁重的工作 相反, 较少去定义一个新的类 但有时候定义一个类是一个很关键的步骤 一个类通常决定了如何对对象进行处理, 决定了对象中应当包含什么样的信息 甚至有时候, 类的定义决定你的项目的成败 1. 旧的实现方法 R 的面向对象 (OOP) 是基于泛型函数 (generic function) 的, 而不是基于类层次结构 什么是 R 中的泛型函数?R 中的面向对象是怎么样的呢? 我们首先看下面来自使用 R 编写统计程序, 第 3 部分 : 可重用和面向对象中的一个实例 下面我们首先来创建一个泛型函数 whoami( ) # 创建泛型函数 > whoami <- function(x,...) UseMethod("whoAmI") > whoami.foo <- function(x) print("i am a foo") > whoami.bar <- function(x) print("i am a bar") > whoami.default <- function(x) print("i don't know who I am") 在 R 中, 每个对象都属于 0 个或 1 个或多个类, 我们可以用 class( ) 函数查看对象所属的类 R 中的类可参考附录 1:R 中的基本类 > a = 1:10 > b = 2:20 > class(a) [1] "integer" > class(b) [1] "integer" 有了泛型函数和类之后, 我们就可以看到 R 中的面泛型函数是如何工作的 > whoami(a) # a 的类为 integer, 没有为该类定义方法, # 就执行 whoami.default 方法 [1] "I don't know who I am"

> attr(a,'class') <- 'foo' # 用 attr( ) 函数将 a 的类指定为 foo > class(a) [1] "foo" > attr(b,'class')<-c('baz','bam','bar') # 指定 b 的属于三个类 'baz','bam','bar' > class(b) [1] "baz" "bam" "bar" > whoami(a) # 现在 a 属于 foo 类, 执行 whoami.foo( ) [1] "I am a foo" > whoami(b) # b 虽然属于三个类, 但只对 bar 类定义了 # 方法, 所以就执行 whoami.bar() [1] "I am a bar" > attr(a,'class') <- 'bar' # 改变 a 的类 > class(a) [1] "bar" > whoami(a) [1] "I am a bar" 上面的例子中提到了一个对象同时属于多个类的情况, 再看下面的一个补充实例 > meth1 <- function(x) UseMethod("meth1") > meth1.mom <- function(x) print("mom's meth1") # meth1 对类 Mom > meth1.dad <- function(x) print("dad's meth1") # 和类 Dad 都定义了方法 > meth2 <- function(x) UseMethod("meth2") # meth2 只对类 > meth2.dad <- function(x) print("dad's meth2") # Dad 定义了方法 > attr(a,'class') <- c('mom','dad') > meth1(a) # 执行了 meth1.mom( ), 因为 Mom 在前 [1] "Mom's meth1" > meth2(a) [1] "Dad's meth2" 包含祖先的一个例子 # 包含祖先 char0 = character(0) makemro <- function(classes=char0, parents=char0) { # Create a method resolution order from an optional # explicit list and an optional list of parents mro <- c(classes) for (name in parents) { mro <- c(mro, name) ancestors <- attr(get(name),'class') mro <- c(mro, ancestors[ancestors!= name]) } return(mro) } NewInstance <- function(value=0, classes=char0, parents=char0) { # Create a new object based on initial value,

# explicit classes and parents (all optional) obj <- value attr(obj,'class') <- makemro(classes, parents) return(obj) } MaternalGrandma <- NewInstance() PaternalGrandma <- NewInstance() Mom <- NewInstance(classes='Mom', parents='maternalgrandma') Dad <- NewInstance(0, classes=c('dad','uncle'), 'PaternalGrandma') Me <- NewInstance(value='Hello World', 'Me', c('mom','dad')) > print(me) [1] "Hello World" attr(,"class") [1] "Me" "Mom" "MaternalGrandma" "Dad" [5] "Uncle" "PaternalGrandma" 从上面的例子, 我们可以看到,R 中的 面向对象 是以类和泛型函数为基础, 类可以多重继承类, 泛型函数可以分派到任意的参数 ( 签名,signature) 集合, 泛型函数将不同的方法聚集到一起, 由 R 根据函数的对象的类型来决定选择执行哪个方法 在某些情况下, 类和方法是不同的概念, 我样要区别对待 2. 类 用 setclass 来定义一个类 setclass(class, representation, prototype, contains=character(), validity, access, where=1, version=false) 其中 : Class 字符串, 类的名称 representation 新的类的接口, 或者该类扩展的其它类 通常是对 representation 函数的一个调用 prototype 为接口提供的默认的数据对象 如果在构造一个新的类的时候, 不明确地改写, 那么新的实例将采用这些数据 contains 该类所扩展的类, 所有扩展的类的新的实例都会继承其所有父类的接口 validity, access, version 与 S-Plus 兼容的控制参数 where 存储或移除定义的元数据的环境定义了一个类后, 就可以用函数 new() 来生成一个类的实例 (instances) 类定义了一个对象的结构 类的实例代表了对象本身 一个子类是对其父类的扩展, 一个新的类将包含其父类的所有接口 在创建一个新的类时, 接口的名字不能重复 ( 包括其直接或间接的父类 ) 下面的代码将创建两个类 foo 和 bar, 再创建它们的一个子类 baz > library(methods) > setclass("foo",representation(a="character",b="numeric"))

[1] "foo" > setclass("bar", representation(d = "numeric", c = "numeric")) [1] "bar" > setclass("baz", contains = c("foo", "bar")) [1] "baz" > getclass("baz") Class baz [in ".GlobalEnv"] Slots: Name: a b d c Class: character numeric numeric numeric Extends: "foo", "bar" 现在我们可以生成类 baz 的一个实例 > x <- new("baz", a = "xxx", b = 5, c = 10) > x An object of class baz Slot "a": [1] "xxx" Slot "b": [1] 5 Slot "d": numeric(0) Slot "c": [1] 10 可以通过操作符 @ 访问接口中的数据 但最好的办法是不直接访问接口的数据, 而是定义一些特殊的方法来访问这些数据 > x@a [1] "xxx" 3. 虚类 虚类就是不会用来生成实例的类 它们是用来将拥有不同的 representations 的类 ( 它们不能互相继承 ) 链接起来, 可以通过虚类为这些不同的 representations 提供相似的功能 一个标准的做法就是建立一个虚类, 然后用其它类来扩展它 在实际中, 可以通过以下几种不同的方式来使用该虚类 1. 虚类的方法将用到其所有的扩展类中 2. 新的类的接口将与虚类的接口的数据类型一致, 这样可以使接口的多样

化 3. 虚类的接口将会出现在它的所有扩展类中 下面我们用类来表示, 一个树状图 一个树状图的结点有三个值 : 高度 左结点 右结点 终端结点与之不同, 有一个高度和一个值 ( 也有可能是另一个对象的实例 ) 我们可以用一个虚类 dendnode 来表示该结构 我们可以再定义两个该类的扩展类 : 终端和非终端结点 > setclass("dendnode") [1] "dendnode" > setclass("dnode", representation(left = "dendnode", right = "dendnode", + height = "numeric"), contains = "dendnode") [1] "dnode" > setclass("tnode", representation(height = "numeric", value = "numeric", + label = "character"), contains = "dendnode") [1] "tnode" 现在我们就可以创建树了, 它的结点或者是终端结点或者是非终端节点 在类 dnode 中, 它的左节点和右节点都是 dendnode 类的实例, 而 dnode 类本身又是 dendnode 的扩展 在此例中虚类被用来允许两个不同的类 : 左节点和右节点 这种设计使得可以重复使用树变得简单 在实际中, 我们经常会出现这样的问题, 希望一个接口或者是一个列表或者是一个空对象 (NULL( )) 因为一个 NULL( ) 本身不是一个列表, 所以它们不能共享同一个接口 我们可以创建一个虚拟类来扩展列表类和 NULL( ) 类 有两种方法可以建立虚类 第一种方法, 与上面一样, 用 setclass( ) 建立一个没有 representation 的类 第二种方法, 在参数 representation 中包括类 VIRTUAL > setclass("myvclass", representation(a = "character", "VIRTUAL")) [1] "myvclass" > getclass("myvclass") Virtual Class myvclass [in ".GlobalEnv"] Slots: Name: a Class: character 4. 初始化和原型 有两种办法可以用来控制类的实例生成的对象的初始值 第一种方法 : 可以用参数 prototype 来控制生成的实例的值 使用该参数, 可以将任何接口赋初值 > setclass("xx", representation(a = "numeric", b = "character"), + prototype(a = 3, b = "hi there")) [1] "xx"

> new("xx") An object of class xx Slot "a": [1] 3 Slot "b": [1] "hi there" 第二种方法是为该类指定一个 initialize 方法, 用该方法为类的实例赋值 > setmethod("initialize", "xx", function(.object, b) + { +.Object@b <- b +.Object@a <- nchar(b) +.Object + }) [1] "initialize" > new("xx", b = "yowser") An object of class xx Slot "a": [1] 6 Slot "b": [1] "yowser" 注意在第二种方法中, 应当在 initialize 方法中返回该对象 5. 泛型函数和方法 面向对象编程的一个重要方面就是泛型函数 泛型函数实际上就是一个分派机制 方法就是一种特殊的函数, 它能根据特定的输入对象执行需要执行的任务 泛型函数的工作就是针对不同的输入参数决定什么样的方法被执行 一旦对泛型函数进行了签名, 那么泛型函数就不能添加新的参数了 在设计泛型函数的参数时, 要将可能用到的参数都包括进来 我们来看下面的一个例子 在该例中, 我们将定义一个名为 whatis( ) 的函数, 该函数返回对象的类型 > whatis <- function(object) data.class(object) > whatis(1:10) [1] "numeric" > whatis(matrix()) [1] "matrix" > whatis(whatis) [1] "function" 上面的程序好像太简单, 我们还可以打印出对象的长度 > whatis <- function(object) cat(" 类 :", + data.class(object),"\n 长度 :",length(object),"\n") > whatis(1:10)

类 : numeric 长度 : 10 > whatis(matrix()) 类 : matrix 长度 : 1 > whatis(whatis) 类 : function 长度 : 1 > A<-matrix(1:6,c(2,3)) > A [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > whatis(a) 类 : matrix 长度 : 6 现在看来, 又改进了一步, 但是还是有点不尽如人意的地方, 这里给出了函数的长度, 意义不大 对于矩阵, 我们更想知道它的行数和列数 所以我们需要为 function 类和 matrix 类单独定义函数, 才能得到我们期望的信息 : > whatis.function <- function(object) cat(" 类 :", + data.class(object),"\n") > whatis.function(whatis) 类 : function > whatis.matrix <- function(object) cat(" 类 :", + data.class(object),"\n",nrow(object)," 行 ",ncol(object)," 列 \n") > whatis.matrix(a) 类 : matrix 2 行 3 列 定义方法 在上面的例子中, 为了得到我们想要的信息, 我们定义了三个功能类似的函数, 这样程序比较散乱, 使用起来也比较繁琐 我们希望通过一个统一的函数名 whatis( ) 来代表上述三个函数, 然后根据输入的参数的类型 (function, matrix 或其它 ) 来决定使用哪一个函数 (whatis.function( ), whatis.function( ) 或 whatis( ) ) 要完成该工作, 我们可以使用函数 setmethod( ) > setmethod("whatis","function", whatis.function) 用函数 "whatis" 来建立新的同屬函数 [1] "whatis" > setmethod("whatis","matrix", whatis.matrix) [1] "whatis" > whatis(1:10) 类 : numeric 长度 : 10 > whatis(whatis)

类 : standardgeneric > whatis(a) 类 : matrix 2 行 3 列 现在我们看到, 我们只用一个函数 whatis( ) 就可以根据参数的类型执行不同的程序代码 这里的函数 whatis( ) 我们称之为泛型函数 ( 上面的输出显示为 standardgeneric ), 分别针对不同类型的对象的三个不同的程序功能称为方法 (method) setmethod( ) 函数的三个参数分别告诉 setmethod 对什么泛型函数指定方法, 执行该方法对应的参数的类型, 执行的方法 其中第二项称为签名 (signature) showmethods( ) 查看为函数函数定义了哪些方法 dumpmethod( ) 提取为泛型函数的某个方法 6. 访问子函数 我们可以通过 @ 运算符来访问接口, 但在实际编程中并不建议这么做 我样可以通过访问子函数来访问接口 > setclass("foo", representation(a = "ANY")) # 新建一个类 foo [1] "foo" # 申明一个标准的泛型函数 a > if (!isgeneric("a")) + { + if (is.function("a")) fun <- a + else fun <- function(object) standardgeneric("a") + setgeneric("a", fun) + } > setmethod("a", "foo", function(object) object@a) [1] "a" > b <- new("foo", a = 10) > a(b) [1] 10

附录 1 R 中的基本类 ### The following are all basic vector classes. ### They can appear as class names in method signatures, ### in calls to as(), is(), and new(). "character" "complex" "double" "expression" "integer" "list" "logical" "numeric" "single" "raw" ### the class "vector" ### is a virtual class, extended by all the above ### The following are additional basic classes "NULL" # NULL objects "function" # function objects, including primitives "externalptr" # raw external pointers for use in C code "ANY" # virtual classes used by the methods package itself "VIRTUAL" "missing" ## The following class names can appear in method signatures, ## as the class in as() and is() expressions, and, except for ## the classes commented as VIRTUAL, in calls to new() "matrix" "array" "ts" "structure" ## VIRTUAL The specific classes all extend class "structure", directly, and class "vector", by class "structure".