【发布时间】:2015-05-26 22:30:06
【问题描述】:
add <- c( 2,3,4)
for (i in add){
a <- i +3
b <- a + 3
z <- a + b
print(z)
}
# Result
[1] 13
[1] 15
[1] 17
在 R 中,它可以打印结果,但我想将结果保存在向量、数据框或列表中以供进一步计算
提前致谢
【问题讨论】:
add <- c( 2,3,4)
for (i in add){
a <- i +3
b <- a + 3
z <- a + b
print(z)
}
# Result
[1] 13
[1] 15
[1] 17
在 R 中,它可以打印结果,但我想将结果保存在向量、数据框或列表中以供进一步计算
提前致谢
【问题讨论】:
尝试类似:
add <- c(2, 3, 4)
z <- rep(0, length(add))
idx = 1
for(i in add) {
a <- i + 3
b <- a + 3
z[idx] <- a + b
idx <- idx + 1
}
print(z)
【讨论】:
i 作为索引呢?这就是使用for 循环的全部意义所在。
i 也不能作为这里的索引 - 它是一个元素向量,可以对其执行操作。
这是简单的代数,根本不需要for循环
res <- (add + 3)*2 + 3
res
## [1] 13 15 17
或者如果你想要data.frame
data.frame(a = add + 3, b = add + 6, c = (add + 3)*2 + 3)
# a b c
# 1 5 8 13
# 2 6 9 15
# 3 7 10 17
虽然一般来说,当你尝试这样的事情时,最好创建一个函数,例如
myfunc <- function(x) {
a <- x + 3
b <- a + 3
z <- a + b
z
}
myfunc(add)
## [1] 13 15 17
如果实际需要循环(与您的示例不同)并且您想要存储其结果,最好使用*apply family 来执行此类任务。例如,如果您想返回一个列表,请使用lapply
res <- lapply(add, myfunc)
res
# [[1]]
# [1] 13
#
# [[2]]
# [1] 15
#
# [[3]]
# [1] 17
如果您想要返回矢量,请使用sapply
res <- sapply(add, myfunc)
res
## [1] 13 15 17
【讨论】:
用于保存所有信息的 data.frame
add <- c( 2,3,4)
results <- data.frame()
for (i in add){
a <- i +3
b <- a + 3
z <- a + b
#print(z)
results <- rbind(results, cbind(a,b,z))
}
results
a b z
1 5 8 13
2 6 9 15
3 7 10 17
如果你只想要 z 然后使用向量,不需要列表
add <- c( 2,3,4)
results <- vector()
for (i in add){
a <- i +3
b <- a + 3
z <- a + b
#print(z)
results <- c(results, z)
}
results
[1] 13 15 17
【讨论】:
将这两个结果与@dugar 的结果进行比较可能会有所启发:
> sapply(add, function(x) c(a=x+3, b=a+3, z=a+b) )
[,1] [,2] [,3]
a 5 6 7
b 10 10 10
z 17 17 17
这是惰性求值的结果,有时在计算中间值时会绊倒我们。下一个应该会给出更符合预期的结果:
> sapply(add, function(x) c(a=x+3, b=(x+3)+3, z=(x+3)+((x+3)+3)) )
[,1] [,2] [,3]
a 5 6 7
b 8 9 10
z 13 15 17
这些结果是@dugar 的转置。使用sapply 或lapply 通常可以节省您设置零个case 对象然后递增计数器的工作量。
> lapply(add, function(x) c(a=x+3, b=(x+3)+3, z=(x+3)+((x+3)+3)) )
[[1]]
a b z
5 8 13
[[2]]
a b z
6 9 15
[[3]]
a b z
7 10 17
【讨论】: