我正在模拟掷骰子,并且想将输出保存在单个对象中,但是找不到解决方法。我尝试查看here,here和here,但它们似乎并没有回答我的问题。
这是我尝试将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
}
但是它们似乎更糟(因为我什至没有看到试验)。
感谢任何提示。
答案 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)
}