我正在模拟掷骰子,并希望将输出保存在单个对象中,但找不到这样做的方法。我试着看这里,这里,但他们似乎没有回答我的问题。
以下是我将 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
}
但它们似乎更糟(因为我什至没有看到试验(。
感谢您的任何提示。
您的尝试有几点错误:
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次或只是60次抽奖都没有关系(
通常,在大多数编程语言中,不会将对象分配给for
循环,因为它们不是正式的函数对象。使用循环在现有对象上进行迭代交互。但是,R 维护apply系列,该系列将迭代输出保存到与输入长度相同的对象。
考虑lapply
(list apply(用于列表输出或sapply
(simplized apply(用于矩阵输出:
# 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)
您可以使用列表:
Twenty=list()
for(i in 1:20){
Twenty[[i]] = sample.int(6, 3, replace = TRUE)
}