用循环存储结果函数 - R

时间:2017-03-14 12:20:13

标签: r function for-loop output

我有一个简单的函数se <- 0.11 * (x^2) - 0.002 * x。我想生成两个输出变量se.mse.st - 每个变量存储100次迭代的结果,并以特定的时间间隔为x提供随机重新定义的值:

se.m <- 0.11 * (x^2) - 0.002 * x      # if x[0,1]

se.st <- 0.11 * (x^2) - 0.002 * x     # if x(1,5]

我写了这段代码:

my.mat <- matrix(0,100,2)
x <- runif(n = 1, min = 0, max = 5)

fuchs <- function(n){
   x.m <- runif(n = 1, min = 0, max = 1)
   x.st <- runif(n = 1, min = 1, max = 5)
  for(i in 1:n){
    print(x.m[i] <- runif(n = 1, min = 0, max = 1))
    se.m <- 0.11 * (x.m^2) - 0.002 * x.m
    print(x.st[i] <- runif(n = 1, min = 1, max = 5))
    se.st <- 0.11 * (x.st^2) - 0.002 * x.st
    }
  return(list(se.m, se.st))
}
fuchs(100)

如何将输出存储在两列中?我尝试使用matrix命令,但是我收到数据太长的错误:

  

my.mat&lt; -matrix(my.mat,se.m)       矩阵中的错误(my.mat,se.m):数据太长

list命令也不会产生任何输出。

我是R的新手,你可以猜到,并且非常赞赏建设性的评论/批评。

2 个答案:

答案 0 :(得分:1)

我不明白你为何循环。您使用的所有功能都是矢量化的。

x.m <- runif(100, 0, 1)

#ensure 1 is not included
repeat {
  x.st <- runif(100, 1, 5)
  if (!any((x.st - 1) < .Machine$double.eps)) break
}

cbind(0.11 * (x.m^2) - 0.002 * x.m,
      0.11 * (x.st^2) - 0.002 * x.st)

最困难的问题是从半开区间采样。这导致floating point imprecision的考虑。因此,您需要在间隔限制附近排除模糊范围。然而,采样下限间隔的概率很低,实际上为零。因此,我不打算处理这个案子。

答案 1 :(得分:0)

1)问题似乎在索引中。

fuchs <- function(n){
x.m=se.m=x.st=se.st=NULL
  for(i in 1:n){
    print(x.m[i] <- runif(n = 1, min = 0, max = 1))
    se.m[i] <- 0.11 * (x.m[i]^2) - 0.002 * x.m[i]
    print(x.st[i] <- runif(n = 1, min = 1, max = 5))
    se.st[i] <- 0.11 * (x.st[i]^2) - 0.002 * x.st[i]
    }
  return(list(se.m, se.st))
}
fuchs(100)

在原始代码中,您将单个随机数设置为变量x.mx.st,然后在for周期中添加其他值。在最后一次迭代中,方程适用于整个向量。请注意,se.mse.st等式是相同的:

  

se.m&lt; -0.11 *(x ^ 2) - 0.002 * x
  se.st&lt; -0.11 *(x ^ 2) - 0.002 * x

2)要在矩阵中输出结果,请使用jogo注释中提供的代码,或使用data.frame。为了更好地解决代码问题,我建议您还返回相应的x值。

return(data.frame(x.m = x.m, se.m = se.m, x.st = x.st, se.st = se.st))

3)runif函数从均匀分布中生成一个数字,而不是极值。功能帮助中的文字:

  

runif不会生成任何一个极值,除非max = minmax-minmin相比较小,特别是对于默认参数。