6

我对 R 中复制函数的输出感到困惑,我试图以两种不同的方式使用它,(在我看来)应该给出一个矩阵作为输出!

所以,如果我使用

replicate(5, seq(1,5,1))

我得到一个矩阵 5x5

    [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5

..没关系,我明白了...

但是,如果我改为使用:

replicate(5, for(i in 1:5){print(i)})

我得到以下信息:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

谁能解释我为什么会这样?谢谢 :)

4

3 回答 3

5

一个for循环返回NULL。所以在第二种情况下,replicate函数执行for(i in 1:5){print(i)}了五次,这就是为什么你会看到所有这些数字都打印出来的原因。

然后将返回值放入一个列表中,因此replicate调用的返回值是一个由五个NULLs 组成的列表,它会被打印出来。执行

x<-replicate(5, for(i in 1:5){print(i)})
x

应该澄清。

于 2013-10-31T21:38:50.367 回答
4

正如@mrip 所说,for循环返回NULL,因此您需要分配给循环内的一个对象,然后将该对象返回给replicate它以便输出。但是,mrip 的代码仍然会在每次replicate评估迭代中产生 NULL。

您还需要将输出分配replicate给一个名称,这样它就不会蒸发,呃,会被垃圾收集。这意味着您需要添加d作为单独的语句,以便花括号内的整个表达式的评估将返回“某物”而不是 NULL。

d <- numeric(5); res <- replicate(5, { 
                            for(i in 1:5){d[i] <- print(i)} ; d}
                                  )
[1] 1
[1] 2

snipped
[1] 4
[1] 5
> res
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5
于 2013-10-31T22:43:56.677 回答
0

for 循环返回一个列表,而seq()调用返回一个向量。这应该与seq()使用 for 循环相同

foo <- function(){
  b = list()
  for(i in 1:5) b[i] <- i
  do.call(c, b)
}

replicate(5, foo())
于 2013-10-31T21:39:18.723 回答