如何将R中print()打印的值相加

时间:2017-03-26 19:07:27

标签: r loops for-loop printing return

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()函数对打印值不起作用。

1 个答案:

答案 0 :(得分:0)

打印到屏幕就是这样;它不会返回打印到调用代码的值。你的函数需要构建一个向量并返回它。以下是一些不同的方法:

代码沿着您尝试做的事情,但从空数字向量开始并为每次迭代构建它:

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中的一个地图函数(这里过度杀伤但可以扩展到不容易矢量化的函数)

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必须移动内存以增加向量的大小。