Netlogo根据给定的长度制作一个列表

时间:2016-01-15 22:17:57

标签: list netlogo

我想从给定长度的值中创建一个列表。

例如,给定列表[0 1]并且所需列表长度为7,输出将为[0 1 0 1 0 1 0]。长度由population定义,由滑块定义。我声明了应该遍历列表的变量x。如果列表的长度短于population的值,则应再次设置为0

我用循环命令尝试了它,但它无限运行:

let x 0
  loop[
    if length exp-dif-li <= population[
      ifelse x < length exp-dif-li[
        set x 0]
      [ set exp-dif-li lput item x exp-dif-li exp-dif-li
        set x x + 1]
    ]
  ]
]

2 个答案:

答案 0 :(得分:5)

modn-values是您的朋友:

class Properties
{
    var x:Int = 1
    var y:Int = 1
}

var myJson : [String:Int] = ["data":10]
var originalProperties = Properties()

// ...

/* Same results as for Example 1: 
   'originalProperties.x = 10' and 'Missing parameter' */

示例用途:

dput(testtable)

structure(list(Week = c("09/07/15", "09/07/15", "08/31/15"), 
    Income = c(2000L, 460L, 304L), Views = c(345L, 11980L, 678L
    ), Partner = c("Bob", "Jane", "Mark")), .Names = c("Week", 
"Income", "Views", "Partner"), class = "data.frame", row.names = c(NA, 
-3L))

week <- c(seq(as.Date("2015/07/15"), by = "day", 
length.out = 7),seq(as.Date("2015/07/15"), by = "day", 
length.out = 7), seq(as.Date("2015/08/15"), 
by = "day", length.out = 7))

df <- cbind(week,testtable[rep(seq_len(nrow(testtable)), each=7),2:ncol(testtable)])


df
             week Income Views Partner
    1  2015-07-15   2000   345     Bob
    2  2015-07-16   2000   345     Bob
    3  2015-07-17   2000   345     Bob
    4  2015-07-18   2000   345     Bob
    5  2015-07-19   2000   345     Bob
    6  2015-07-20   2000   345     Bob
    7  2015-07-21   2000   345     Bob
    8  2015-07-15    460 11980    Jane
    9  2015-07-16    460 11980    Jane
    10 2015-07-17    460 11980    Jane
    11 2015-07-18    460 11980    Jane
    12 2015-07-19    460 11980    Jane
    13 2015-07-20    460 11980    Jane
    14 2015-07-21    460 11980    Jane
    15 2015-08-15    304   678    Mark
    16 2015-08-16    304   678    Mark
    17 2015-08-17    304   678    Mark
    18 2015-08-18    304   678    Mark
    19 2015-08-19    304   678    Mark
    20 2015-08-20    304   678    Mark
    21 2015-08-21    304   678    Mark

编辑:意识到谈论为什么会这样有用会很好! to-report continue-list [ lst n ] report n-values n [ item (? mod length lst) lst ] end 通过将号码observer> show continue-list [0 1] 7 observer: [0 1 0 1 0 1 0] observer> show continue-list [0 1] 1 observer: [0] observer> show continue-list [0 1 2 3 4] 22 observer: [0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1] 通过n-values n [ ... ]发送给给定的记者来创建长度为n的列表。报告者使用0访问该号码(这是NetLogo task语法)。所以我们想继续重复原始列表中的项目。重复循环数字的一个非常好的功能是n - 1。通常,新列表的项?应为项mod。因此,将i放在一起,可以根据需要重复列表i mod <length of original list>中的项目,从而创建一个新的n-values n [ item (? mod length lst) lst ]列表。

答案 1 :(得分:1)

要退出循环,您需要调用结束或停止。

插入行

if length exp-dif-li = 7 [stop]

正确的地方会这样做。循环很容易变成无限循环和冻结,因此最好避免使用。

我更喜欢while循环。它们更安全,更不容易出现无限循环,看起来像这样

while length exp-dif-li < 7
  [
   if length exp-dif-li <= population[
  ifelse x < length exp-dif-li[
    set x 0]
  [ set exp-dif-li lput item x exp-dif-li exp-dif-li
    set x x + 1]
  ]  

Netlogo有另一种方法,我在其他地方没见过,并且对无限循环非常强大。 [重复]在你的情况下的用法似乎是

  repeat 7  [
            if length exp-dif-li <= population[
             ifelse x < length exp-dif-li[set x 0]
             [ set exp-dif-li lput item x exp-dif-li exp-dif-li
            set x x + 1]
            ]
相关问题