在嵌套的for循环之外初始化矩阵的地方有用吗?

时间:2015-07-13 19:58:44

标签: r for-loop initialization

我有以下R代码。我想知道我放的时候有什么不同         mat< -matrix(1:20,ncol = 5)在函数外部。我在两种情况下都得到了相同的结果。

fun<-function(x,y){
  mat<-matrix(1:20, ncol=5)
  for (i in 1:x){
    for (j in 1:y){
      mat[i,j]=rnorm(1)
      return(mat)
    }
  }
}
fun(4,5)

以下代码按照评论和答案中的建议运行。转换为上述函数时为什么它不起作用?

mat<-matrix(1:20, ncol=5)
for(i in 1:4){
  for (j in 1:5){
   mat[i,j]=rnorm(1)
  }
}
mat

1 个答案:

答案 0 :(得分:1)

fun1 <- function(x,y) {
  mat <- matrix(1:20, ncol=5)
  mat[1:x, 1:y] <- rnorm(x*y)
  mat
}

这将实现您创建一个函数的目标,该函数接受索引作为两个参数,并返回索引随机正态分布数字的矩阵。

fun1(2,1)
#           [,1] [,2] [,3] [,4] [,5]
#[1,] -0.2883407    5    9   13   17
#[2,] -0.5290704    6   10   14   18
#[3,]  3.0000000    7   11   15   19
#[4,]  4.0000000    8   12   16   20

请注意,调用函数时会返回最后一行。

在函数中创建的mat矩阵在全局环境中不可用:

mat
#Error: object 'mat' not found

每当你编写一个嵌套的for循环作为R的新用户时,警报响应就会消失。通常有更好的方法。嵌套循环的优点是它有意义。&#34;但是,明确的逻辑进展在执行方面效率非常低。当然也有例外,但你很可能不会很快遇到它们。最好花时间学习R的编程直觉。

关于研究范围的讨论很多:

  1. R environments and function call stacks

  2. Scoping and functions in R 2.11.1 : What's going wrong?

  3. http://developer.r-project.org/nonstandard-eval.pdf

  4. http://adv-r.had.co.nz/Functions.html#lexical-scoping