#传统的if-else
x<-4
if(x>3){
y<-10
}else{
y<-0
}
y
## [1] 10
#R的特别if-else
x<-4
y<-if(x>3){10}else{0}
y
## [1] 10
x <- c("a", "b", "c", "d")
#第一种for循环,同其他编程语言
for(i in 1:4){
print(x[i])
}
## [1] "a"
## [1] "b"
## [1] "c"
## [1] "d"
#第二种for循环
for(i in seq_along(x)) {
print(x[i])
}
## [1] "a"
## [1] "b"
## [1] "c"
## [1] "d"
#第三种for循环
for(letter in x) {
print(letter)
}
## [1] "a"
## [1] "b"
## [1] "c"
## [1] "d"
#当循环体只有一句话的时候,为使代码紧凑可以这样写(去掉了花括号):
for(i in 1:4) print(x[i])
## [1] "a"
## [1] "b"
## [1] "c"
## [1] "d"
z <- 5
while(z >= 3 && z <= 10) {
print(z)
coin <- rbinom(1, 1, 0.5)
if(coin == 1) { ## random walk
z <- z + 1
} else {
z <- z - 1
}
}
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 7
## [1] 6
## [1] 5
## [1] 4
## [1] 3
## [1] 4
## [1] 3
repeat是一个无限循环的函数,只有当遇到break时才会退出循环 next的作用于java里的continue一样,即终止本次循环,开启下一次循环 retun即返回一个值,也会伴随着循环的终止。
声明名称的变量会按照声明的名称进行赋值;而没有声明名称的变量会按照函数的参数顺序,优先赋值给未有值的变量。
f <- function(a, b) {
a^2
}#这里的b就叫做自由变量,不影响函数的运行
f(2)
## [1] 4
对于函数中定义的…:一般表示作用在函数中的不确定数量的参数情况。比如:
args(paste)
## function (..., sep = " ", collapse = NULL)
## NULL
其中的…表示用来合并黏贴的元素,因为不知道数量所以用…表示。
#例子1 加法函数
add2<-function(x,y){
x+y
}
#例子2 返回向量中>10的元素
aboveten<-function(x){
use <- (x>10)
x[use]
}
#例子3 返回向量中大于一个数的元素
above <- function(x,n){
use <- (x>n)
x[use]
}
#例子4 设置缺省参数(默认参数)
above <- function(x,n=10){
use <- x>n
x[use]
}
作用域规则:R的词法作用域规则决定了一个函数中的值是如何与自由变量绑定起来的。在一个函数中,有两种类型的变量,其中一种是函数的参数,它通过函数定义传入函数;另一种是存在于函数中,但非参数的变量或符号。R的做法是:用搜索列表给符号赋值的方法。
简单来说,当在局部函数中无法找到参数的值,就会去全局环境中搜索参数值,这也就是自由变量取值的来源。
make.power <- function(n) {
pow <- function(x) {
x^n
}
pow
}
cube <- make.power(3)#这里的3表示的是n,是外层函数的赋值,下面同理
square <- make.power(2)
#对内层函数x的赋值则如下,这时候cube和square就和pow是一样的了:
cube(3)
## [1] 27
square(3)
## [1] 9
R语言中,Date的类型是 yyyy-mm-dd
x <- as.Date("1970-01-01")
x
## [1] "1970-01-01"
unclass(x)#1970年1月1日是R语言的起始时间
## [1] 0
unclass(as.Date("1970-01-02"))
## [1] 1
Time的类型有两种POSIXct和POSIXlt. POSIXlt中储存的是包含sec,min,hour等的元素。
x <- Sys.time()
x
## [1] "2017-08-06 15:01:13 CST"
p <- as.POSIXlt(x)
names(unclass(p))
## [1] "sec" "min" "hour" "mday" "mon" "year" "wday"
## [8] "yday" "isdst" "zone" "gmtoff"
p$sec
## [1] 13.68482
PoSIXct则是记录了从1970年1月1日到现在的秒数,不包含POSIXlt中的sec等元素。经由Sys.time函数调用的时间默认是POSIXct格式的。
x <- Sys.time()
x
## [1] "2017-08-06 15:01:13 CST"
unclass(x)
## [1] 1502002874
p <- as.POSIXlt(x)
p$sec
## [1] 13.9395
R的时间和日期函数的优势在于可以自动计算闰年、时差等因素。
x <- as.Date("2012-03-01")
y <- as.Date("2012-02-28")
x-y
## Time difference of 2 days
#在使用POSIXct时,tz默认为当前系统时间所在的时区。
x <- as.POSIXct("2012-10-25 01:00:00")
y <- as.POSIXct("2012-10-25 06:00:00", tz = "GMT")
y-x
## Time difference of 13 hours
R中个的时间格式可以用%加一个字母来组成:
x <- as.Date("2012-01-01")
y <- strptime("9 Jan 2011 11:34:21", "%d %b %Y %H:%M:%S")
#%d表示day,%b表示month,%Y表示year,%H/%M/%S分别表示时分秒。
#无法执行x-y,因为x和y的格式不同
x <- as.POSIXlt(x)
x-y
## Time difference of NA secs