我对R中复制函数的输出感到困惑,我试图以两种不同的方式使用它,(在我看来)应该给出一个矩阵作为输出!
所以,如果我使用
replicate(5, seq(1,5,1))
Run Code Online (Sandbox Code Playgroud)
我得到一个矩阵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
Run Code Online (Sandbox Code Playgroud)
..那没关系,我明白了......
但是,如果我改为使用:
replicate(5, for(i in 1:5){print(i)})
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
[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
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释我为什么会这样?谢谢 :)
一for回路返回NULL.所以在第二种情况下,replicate函数执行for(i in 1:5){print(i)}五次,这就是为什么你看到打印出来的所有数字的原因.
然后它将返回值放在一个列表中,因此replicate调用的返回值是一个五个NULLs 的列表,它将被打印出来.执行
x<-replicate(5, for(i in 1:5){print(i)})
x
Run Code Online (Sandbox Code Playgroud)
应澄清一下.
正如@mrip所说,for循环返回NULL,因此您需要分配给循环内的一个对象,然后返回该对象,replicate以便可以输出它。然而,mrip 的代码在每次评估迭代中仍然会产生 NULL replicate。
您还需要为 的输出分配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
Run Code Online (Sandbox Code Playgroud)