存储循环中的值

时间:2018-09-29 18:34:00

标签: r loops

我正在模拟掷骰子,并且想将输出保存在单个对象中,但是找不到解决方法。我尝试查看hereherehere,但它们似乎并没有回答我的问题。

这是我尝试将20 x 3试用结果分配给一个对象:

set.seed(1) 
Twenty = for(i in 1:20){   
  trials = sample.int(6, 3, replace = TRUE)   
  print(trials)   
  i = i+1 
}
print(Twenty)

我不明白的是为什么我在运行该函数后无法重新调用它?

我还尝试在函数中使用return代替print

Twenty = for(i in 1:20){
  trials = sample.int(6, 3, replace = TRUE)
  return(trials)
  i = i+1
}
print(Twenty)

或首先创建一个空矩阵:

mat = matrix(0, nrow = 20, ncol = 3)
mat    
for(i in 1:20){
  mat[i] = sample.int(6, 3, replace = TRUE)
  print(mat)
  i = i+1
}

但是它们似乎更糟(因为我什至没有看到试验)。

感谢任何提示。

3 个答案:

答案 0 :(得分:1)

通常,在大多数编程语言中,它们不会将对象分配给for循环,因为它们不是形式上的函数对象。人们使用循环在现有对象上进行迭代交互。但是,R保留了 apply 系列,该系列将迭代输出保存到与输入长度相同的对象上。

考虑lapply l 适用)进行列表输出,或者考虑sapply s 简化的应用于矩阵输出)

# LIST OUTPUT
Twenty <- lapply(1:20, function(x) sample.int(6, 3, replace = TRUE))

# MATRIX OUTPUT
Twenty <- sapply(1:20, function(x) sample.int(6, 3, replace = TRUE))

要查看您的试验,只需打印出对象

print(Twenty)

但是由于您从不使用迭代器变量x,所以请考虑使用replicate(包装到sapply的包装程序,该包装程序可以通过一个参数输出矩阵或列表)来接收大小和表达式(没有序列输入或函数)参数:

# MATRIX OUTPUT (DEFAULT)
Twenty <- replicate(20, sample.int(6, 3, replace = TRUE))

# LIST OUTPUT
Twenty <- replicate(20, sample.int(6, 3, replace = TRUE), simplify = FALSE)

答案 1 :(得分:1)

您的尝试有几处错误:

1)循环既不是函数也不是R中的对象,因此将循环分配给变量没有意义

2)当您有一个循环for(i in 1:20)时,该循环将递增i,因此添加i = i + 1毫无意义。

您上一次正确实施的尝试如下所示:

mat <- matrix(0, nrow = 20, ncol = 3)
for(i in 1:20){
     mat[i, ] = sample.int(6, 3, replace = TRUE)
}
print(mat)

我个人会这样做

matrix(sample.int(6, 20 * 3, replace = TRUE), nrow = 20)

(由于所有平局都是独立的并且可以替换,因此无论您进行3次平局还是20次平局都无所谓)

答案 2 :(得分:0)

您可以使用列表:

Twenty=list()
for(i in 1:20){
  Twenty[[i]] = sample.int(6, 3, replace = TRUE)
}