簡體   English   中英

如何對R中的print()打印的值求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM