内容

1构建块

x <- rnorm(1000) y <- x + rnorm(1000) df <- data.frame(Independent = x, Dependent = y) fit <- lm(Dependent ~ Independent, df) anova(fit)
##方差分析表## ## Response: Dependent ## Df Sum Sq Mean Sq F value Pr(>F) ## Independent 1 1015.5 1015.47 1001 < 2.2e-16 *** #残差998 1012.4 1.01 ##——# Signif。编码:0 '***' 0.001 '**' 0.01 '*' 0.05 '。“0.1”1

原子的矢量

属性

x <-结构(list(), class="Foo")属性(x)
## # [1] "Foo"
(检查(x))
## @4967c40 19 VECSXP g0c0 [OBJ,NAM(2),ATT] (len=0, tl=0) ## @451a628 9 CHARSXP g0c1 [gp=0x60] [cached] "Foo" ## @451a628 9 CHARSXP g0c1 [gp=0x60][缓存]"Foo"

一个隐式类-矩阵()

列表()环境()

Plain-old-functions

2S3对象系统

人< -函数(name =字符(),年龄=数字()){stopifnot (is.character(名字),is.numeric(年龄),(年龄> 0),长度(名字)= =(年龄))结构(列表(name =姓名、年龄=年龄),类=“人”)}员工< -函数(人=(),工作=字符()){stopifnot(相同(类(的人),“人”),is.character(工作),长度(人)= =美元(工作))员工< -人员工工作< -工作类(员工)< - c(“雇员”类(员工))员工}公司< -函数(company_name =字符(),员工=员工()){stopifnot (is.character (company_name),长度(company_name) = = 1 l ! is.na (company_name),继承(员工,结构(list(company_name = company_name, Employees = Employees), class = "Company")}

通用的

描述<-函数(对象,…)UseMethod(“描述”)

方法

描述。人<- function(object, ...) sprintf("%s; age %s", object$name, object$age) description.Employees <- function(object, ...) { person_description <- NextMethod() sprintf("%s; job %s", person_description, object$job) }

优势& weakneses

3.练习

练习:名称()年龄()访问器

类字段的名字年龄。这些可以通过深入实现细节并提取列表元素来访问,例如,人()美元的名字。但这种直接操纵被认为是不好的做法;最好使用定义“应用程序编程接口(API)”的“访问器”来访问对象中的信息。编写普通的旧函数(例如name <- function(x)…)提取姓名和年龄。

答:

name <- function(x) x$age <- function(x) x$age . name <- function(x) x$age . name

练习:长度()S3方法

长度呢?指示此函数是(S3)泛型。定义一个S3长度方法类;注意,我们在验证输入时使用这个员工()

答:

长度。人<- function(x) length(name(x))

练习:S3泛型和方法

修改名称()年龄()S3泛型和方法。思考普通旧函数与泛型+方法的好处和代价。

答:

name <-函数(x) UseMethod("name")的名称。人<- function(x) x$name age <- function(x) UseMethod("age") age.Person <- function(x) x$age

练习:(在S4演示后返回此处)

重新实现的,员工,公司S3以S4为例。比较和对比。S4通常被认为是冗长的;S4实现比S3实现更长还是更复杂?

答:

People <- setClass("People", slots = c(name = "character", age = "numeric")) setValidity("People", function(object) {if (!identical(length(name(object)), length(age(object)))) {"length of name() and age() differ"} else TRUE});
##类“People”[in]。GlobalEnv"] ## ## Slots: ## ## Name: Name age ## Class:数字字符
<- setClass("Employees", contains = "People", slots = c(job = "character")) setValidity("Employees", function(object) {if (!identical(length(Employees (object)), length(jobs(object)))) {"length of employee() and job() differ"} else TRUE})
## Class "Employees" [in "。GlobalEnv"] ## ## Slots: ## ## Name: job Name age ## Class: character character numeric ## ## Extends: "People"
if (length(company_name) != 1 || !is.na(company_name)) {"company_name必须是长度1,而不是长度1 "}else TRUE})
## Class "Company" [in "。GlobalEnv"] ## ## Slots: ## ## Name: company_name employee ## Class: character Employees

4确认

本课程报告的研究得到了国家人类基因组研究所和国家卫生研究院国家癌症研究所的支持,奖励编号为U41HG004059和U24CA180996。

该项目获得了欧盟地平线2020研究与创新项目(批准协议编号633974)下的欧洲研究理事会(ERC)的资助。