[英]How to sum values printed by print() in R
T <- function (p,q) {
for (x in 1:3) {
for (y in 1:3) {
sum(p*x + q*y)
print(sum(p*x + q*y))
}
}
}
sum(T(2,2))
我想要4、6、8、6、8、10、8、10、12的總和,這是p = 2和q = 2的循環的輸出,但結果是
sum(T(2,2))
[1] 4
[1] 6
[1] 8
[1] 6
[1] 8
[1] 10
[1] 8
[1] 10
[1] 12
有什么方法可以求和或將打印的值更改為矢量,而不是每個值的列表? sum()函數不適用於打印值。
打印到屏幕上完全可以做到這一點; 它不會返回打印到調用代碼的值。 您的函數需要構建一個向量並將其返回。 這是幾種不同的方法:
T1 <- function(p, q) {
out <- numeric(0)
for (x in 1:3) {
for (y in 1:3) {
out <- c(out, p * x + q * y)
}
}
out
}
T2 <- function(p, q) {
out <- numeric(3 ^ 2)
for (x in 1:3) {
for (y in 1:3) {
out[(x - 1) * 3 + y] <- p * x + q * y
}
}
out
}
purrr
使用其中一個地圖函數(此處過度purrr
,但可以擴展為不容易向量化的函數) library(purrr)
T3 <- function(p, q) {
map2_dbl(rep(1:3, each = 3), rep(1:3, 3), function(x, y) p * x + q * y)
}
T4 <- function(p, q) {
rep(1:3, each = 3) * p + rep(1:3, 3) * q
}
outer
實現與T4相同(根據@alistaire的評論): T5 <- function(p, q) {
c(outer(1:3 * p, 1:3 * q, `+`))
}
應當注意的是,這些方法的效率將隨着循環大小的增加而變化,但是通常方法4緊隨其后是方法5的最有效方法。對於小循環,有趣的是方法1似乎比方法2更好,但是1隨着循環大小的增加而變得無效,因為R必須移動內存以保持向量大小的增加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.