week3note控制语句

来源:互联网 发布:frozen js中 编辑:程序博客网 时间:2024/05/21 11:29

1. switch语句

switch是多分支语句,其用法为:

switch (statement, list);

statement是一个表达式,list是列表,也可以用有名定义。根据表达式与list的关系返回一个值。如果表达式返回值属于1:length(list)中的一个,则返回list中相应位置的值,否则返回NULL

example:

a <- switch (2, 2+2, mean(1:10), rnorm(4))[1]  5.5 x <- "fruit";a <- switch (x, fruit="apple", drink="coffee", vegetable="broccoli"); a [1]  "apple"

2. for语句

循环结构中常用的是for循环,是对一个向量或列表的逐次处理,格式为

for( name in values) {expression} 

2.1 ex:Hilbert矩阵构造

构造3阶Hilbert矩阵,Hilbert矩阵的分量满足 H[i,j]=1/(i+j-1)

H <- matrix(0, ncol=3, nrow=3)for (i in 1:3 ) { for (j in 1:3)  {   H[i,j] <- 1/(i+j-1)  }}H> H  [,1]  [,2]  [,3][1,] 1.0000000 0.5000000 0.3333333[2,] 0.5000000 0.3333333 0.2500000[3,] 0.3333333 0.2500000 0.2000000

利用outer简化:

Hilbert <- function(x,y){    1/(x+y-1)}outer(1:3,1:3,Hilbert)  [,1]  [,2]  [,3][1,] 1.0000000 0.5000000 0.3333333[2,] 0.5000000 0.3333333 0.2500000[3,] 0.3333333 0.2500000 0.2000000

2.2 ex 概率问题

假设一共有365个生日(只考虑月、日),而且各生日的概率是相等的(这里忽略了闰年的情况以及可能存在的出生日期分布的不均匀)。设一个班有n个人,当n大于365时至少两个人生日相同是必然事件。当n小于等于365时,可以计算至少有两个人生日在同一天的概率

使用a,b,c三种方法比较时间:
#方法a
a <- function(){
x = numeric(365)
n <- 1:365
for(i in n)
{ x[i]= 1
for(j in 0:(i-1)) {
x[i]= x[i] * (365-j)/365
x[i] <- 1 - x[i] }
}
}

#方法bb <- function(){n <- 1:365x <- numeric(365) for(i in n){ x[i] = 1 - prod((365:(365-i+1))/365) } }#方法cc <- function(){x <- 1-cumprod((365:1)/365)}system.time(a())system.time(b())system.time(c())

结果如下:

> system.time(a())用户 系统 流逝 0.34 0.00 0.34 > system.time(b())用户 系统 流逝    000 > system.time(c())用户 系统 流逝    000 

2.3 读取多个文件存成list

a <- list(rep(0,2))i=1for (fn in list("user.txt","usersorted.txt")) {      a[[i]] <- read.table(fn)      i=i+1}a[[1]]#结果> a[[1]]V1  V2  V3 V41 Name Sex Age Height2Alice   F  13   56.53Becka   F  13   65.34 Gail   F  14   64.35Karen   F  12   56.36Kathy   F  12   59.87 Mary   F  15   66.58Sandy   F  11   51.39   Sharon   F  15   62.510   Tammy   F  14   62.811  Alfred   M  14   69.012Duke   M  14   63.513   Guido   M  15   67.014   James   M  12   57.315 Jeffrey   M  13   62.516John   M  12   59.017  Philip   M  16   72.018  Robert   M  12   64.819  Thomas   M  11   57.520 William   M  15   66.5

2.4 对非向量集合的循环

R并不支持直接对非向量集合的循环,但可
- 使用lapply()函数
- 使用get()函数:它接受一个代表对象名字的字符串参数,返回该对象的内容

设u、v为包含两列的数值型矩阵,则

 for (m in c("u","v")) {    z <- get(m)    print(lm(z[,2] ~ z[,1])) }

3. while repeat (略)

0 0
原创粉丝点击