【问题标题】:replicate function in R returns NULLR中的复制函数返回NULL
【发布时间】:2013-10-31 21:33:27
【问题描述】:

我对 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

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

【问题讨论】:

  • 您的表达式返回值 NULL。作为副作用,它还会将值打印到控制台。但这些是不同的行动。

标签: r replicate


【解决方案1】:

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

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

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

应该澄清一下。

【讨论】:

  • 感谢您的回答。是的,我之前确实尝试过,并注意到x 返回NULL,但我对它为什么这样做感到困惑。是因为for 首先返回一个列表(5 次 1-->5)然后它没有运行,所以replicate 有 5 个NULLs
【解决方案2】:

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

您还需要将replicate 的输出分配给一个名称,这样它就不会蒸发,呃,会被垃圾收集。这意味着您需要将 d 添加为单独的语句,以便对花括号内的整个表达式的求值将返回 'something' 而不是 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

【讨论】:

  • 感谢对对象的解释。如果我猜对了,您将replicate 函数分配给res,然后for 循环将必须打印的输出分配给d[i],然后您将d 可视化,应该重复5 次,这就是你得到矩阵的原因......正确吗?
  • 基本上是的,但我更喜欢“从内到外”考虑嵌套函数调用,所以我会颠倒您构建的顺序。
【解决方案3】:

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

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

replicate(5, foo())

【讨论】:

  • 您编写的函数确实有效,看起来您使用的b[i] &lt;- i 分配类似于@DWin 所做的。我有一个问题,对不起,如果它是微不足道的,在do.call(c, b),我知道b 是什么,但是c 怎么样?
  • c 只是函数c,见?c。它将值组合成一个向量或列表
猜你喜欢
  • 2012-04-29
  • 2014-06-29
  • 2021-01-06
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2022-01-03
  • 2019-05-04
  • 2020-02-10
相关资源
最近更新 更多