我想根据另外两个名为
list1
和list2
的列表中的值更新名为list3
的列表中的几个值。基本上,list2
中的值确定模型应使用哪个方程来更新 list1
中的值,而 list3
中的值用于这些方程中。
一个工作示例是:
turtles-own [list1 list2 list3]
to setup
clear-all
setup_turtles
reset-ticks
end
to setup_turtles
create-turtles 10
[
set list1 n-values 20 [1]
set list2 n-values 20 [0 + random 3]
set list3 n-values 20 [-0.5 + random-float 1]
]
end
to go
ask turtles[ update_list1 ]
tick
end
to update_list1
set list1 (map [[b c] ->
if (b = 0) [ 1 + c ]
if (b = 1) [ 1 - c ]
if (b = 2) [ 1 - c / 2 ]
] list2 list3)
end
Netlogo 告诉我它需要
if
语句中的命令,考虑到 if 函数的构建方式,这是有道理的。我想知道他们是否是一种可以解决这个问题的解决方法。
我尝试在 update_list1 过程中使用
ifelse-value
函数而不是 if
并且它有效(见下面的代码)
to update_list1
set list1 (map [[b c] ->
ifelse-value (b = 0) [ 1 + c ] [
ifelse-value (b = 1) [ 1 - c ][
1 - c / 2
]
]
] list2 list3)
end
但是,稍后我计划在 list2 中有 3 个以上的不同值,我想避免连续多次调用
ifelse-value
导致的多重缩进。
Netlogo 可以选择对
ifelse
或 ifelse-value
的一次调用使用多个布尔值。为此,您需要将整个表达式放在圆括号中:(ifelse-value boolean1 [ reporter1 ] boolean2 [ reporter2 ] ... [ elsereporter ])
。
这确保您不必使用嵌套的ifelse-value
's
to update_list1
set list1 (map [[b c] ->
(ifelse-value
b = 0 [ 1 + c ]
b = 1 [ 1 - c ]
b = 2 [1 - c / 2]
[print "b is not one of the expected values"]
)
] list2 list3)
end