【问题标题】:Store values from a loop存储循环中的值
【发布时间】:2018-09-29 18:33:59
【问题描述】:

我正在模拟掷骰子,并希望将输出保存在单个对象中,但找不到这样做的方法。我尝试查看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
}

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

感谢任何提示。

【问题讨论】:

  • 编程语言是什么?

标签: r loops


【解决方案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次都没关系)

【讨论】:

    【解决方案2】:

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

    考虑lapplyl应用)用于列表输出或sapplys简化应用)用于矩阵输出:

    # 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,请考虑接收大小和表达式(没有序列输入或函数)的replicatesapply 的包装器,通过一个参数可以输出矩阵或列表)论据:

    # 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)
    

    【讨论】:

      【解决方案3】:

      你可以使用列表:

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

      【讨论】:

        猜你喜欢
        • 2016-08-21
        • 1970-01-01
        • 2013-12-07
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 1970-01-01
        相关资源
        最近更新 更多