# for循环

## 组成

• 输出
使用vector()函数，参数：向量类型（“logical”，“integer”,"double","character"）+向量长度
vector(“logical”/“integer”/"double"/"character"/"list", ncol(df)/length(vector))
• 序列
seq_along()
• 循环体

# p221练习题

1. 不知道怎么开始每列的循环，select()可以选择。。
|| 答案：ncol()
a.
``````output <- vector("double", ncol(mtcars))
names(output) <- names(mtcars)
for (i in names(mtcars)) {
output[i] <- mean(mtcars[[i]])
}
output
``````

b.确定数据类型？ class()

• 注意的是这里需要的不是一个向量，而是一个list，因为会有很多类型
``````data("flights", package = "nycflights13")
output <- vector("list", ncol(flights))
names(output) <- names(flights)
for (i in names(flights)) {
output[[i]] <- class(flights[[i]])
}
output
``````

c.

``````data("iris")
iris_uniq <- vector("double", ncol(iris))
names(iris_uniq) <- names(iris)
for (i in names(iris)) {
iris_uniq[i] <- length(unique(iris[[i]]))
}
iris_uniq
``````

d.

``````n <- 10
mu <- c(-10, 0, 10, 100)
normals <- vector("list", length(mu))
for (i in seq_along(normals)) {
normals[[i]] <- rnorm(n, mean = mu[i])
}
normals
``````
``````stringr::str_c(letters, collapse = "")
``````

`sd(x)`

``````all.equal(cumsum(x),out)
``````

a.

``````humps <- c("five", "four", "three", "two", "one", "no")
for (i in humps) {
cat(str_c("Alice the camel has ", rep(i, 3), " humps.",
collapse = "\n"), "\n")
if (i == "no") {
cat("Now Alice is a horse.\n")
} else {
cat("So go, Alice, go.\n")
}
cat("\n")
}
``````

b.

``````numbers <- c("ten", "nine", "eight", "seven", "six", "five",
"four", "three", "two", "one")
for (i in numbers) {
cat(str_c("There were ", i, " in the bed\n"))
cat("and the little one said\n")
if (i == "one") {
cat("I'm lonely...")
} else {
cat("Roll over, roll over\n")
cat("So they all rolled over and one fell out.\n")
}
cat("\n")
}
``````

c.

``````bottles <- function(i) {
if (i > 2) {
bottles <- str_c(i - 1, " bottles")
} else if (i == 2) {
bottles <- "1 bottle"
} else {
bottles <- "no more bottles"
}
bottles
}
beer_bottles <- function(n) {
# should test whether n >= 1.
for (i in seq(n, 1)) {
cat(str_c(bottles(i), " of beer on the wall, ", bottles(i), " of beer.\n"))
cat(str_c("Take one down and pass it around, ", bottles(i - 1),
" of beer on the wall.\n\n"))
}
cat("No more bottles of beer on the wall, no more bottles of beer.\n")
cat(str_c("Go to the store and buy some more, ", bottles(n), " of beer on the wall.\n"))
}
beer_bottles(3)
``````

# for循环变体

• 修改现有对象
• 使用名称或者值进行迭代，而不使用索引
• 处理未知长度的输出
• 处理未知长度的序列
[[，表明我们要处理的是单个元素

## 循环模式（三种）

• 数值索引 for(i in seq_along(xs))
• 元素进行循环 for(x in xs)
• 名称进行循环 for(nm in names(xs))

while循环

# 映射函数

map(); map_lgl(), map_int(); map_dbl(); map_chr()
purrr()函数基本是用C实现的

## R基础包

lapply(), sapply(), vapply()

# p231练习题

1. map_dbl(mtcars, mean)
map_chr(nycflights13::flights, typeof)
length(unique(iris\$Species))
2. map_lgl(iris, is.factor)
3. 产生1个，2，3, 4，5个随机数

# 失败操作

safely(), error,result; possibly(),quietly(),

# 多参数映射

map2(),pmap(), invoke_map()

# 游走函数

walk(), pwalk(),walk2()d都会隐式地返回.x