【问题标题】:store function results in a vector存储函数结果为向量
【发布时间】:2016-11-21 11:37:45
【问题描述】:

我在这里有一个可以采集样本的函数,它可以工作,但是我正在努力将采集的样本存储在一个向量中,以便我可以绘制它们;下面是我的功能:

InvCDF = function(n, sd) {
for (i in 1:n) {
u=runif(1, min = 0, max = 1)
x = sqrt(-2*(sd^2)*log(1-u))
print(x)
}
}

我尝试过创建一个初始为 0 的向量

x = vector(mode="numeric",length=n)

然后以某种方式用采集的样本填充这些 0,但它不起作用。

如果有人可以帮忙将我的 print(x) 值存储在向量中,我会很高兴

【问题讨论】:

  • 这是什么语言?
  • 这是使用 R

标签: r function vector sampling storing-data


【解决方案1】:

这里真的没有必要使用循环。 runifsqrtlog 等一样被矢量化。

InvCDF = function(n, sd) {
  u <- runif(n, 0, 1)
  sqrt(-2*(sd^2)*log(1-u))
}

set.seed(1) # for reproducibility
InvCDF(5, 1)
#[1] 0.7855916 0.9647926 1.3043220 2.1855104 0.6711903

【讨论】:

    【解决方案2】:

    您需要创建一个列表来存储 x 的所有迭代。那么您需要调用所需的函数来获取这些值,即这里 xx 将存储结果。正如 Roland 所建议的,在 R 中增加一个列表是一个非常缓慢的操作。您应该尽可能使用矢量化方法。

    InvCDF = function(n, sd) {
        x=list()
        for (i in 1:n) {
            u=runif(1, min = 0, max = 1)
            x[[i]] = sqrt(-2*(sd^2)*log(1-u))           
        }
        unlist(x)
    }
    xx=InvCDF(100,19)
    

    您可以预先定义一个向量并在循环中使用它。这将比列表操作快得多。

    x <- numeric(n)
    InvCDF = function(n, sd) {
        for (i in 1:n) {
            u=runif(1, min = 0, max = 1)
            x[i] = sqrt(-2*(sd^2)*log(1-u))
        }
        x
    }
    

    【讨论】:

    • 不,确实没有必要使用列表。而且你真的不应该在循环中增长一个对象。这是可能的最慢操作之一。如果您绝对想使用for 循环,只需执行x &lt;- numeric(n)
    • 是的,这里不需要列出。我对这个问题考虑得不够多,只是更正了 OP 的代码。我将编辑我的答案以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多