以下可能是 Netlogo 的基本编程问题。我想写一篇通用的记者,我可以为他们应该报道的内容提供论据。假设有以下程序:
turtles-own [
houses
cars
]
to setup
clear-all
create-turtles 10
reset-ticks
end
to go
ask turtles [
set houses houses + random 2
set cars cars + random 5
]
tick
end
Run Code Online (Sandbox Code Playgroud)
我可以写一篇关于房屋平均数的记者:
to-report mean-houses
report mean [ houses ] of turtles
end
Run Code Online (Sandbox Code Playgroud)
但我想要一个通用的报告器,我也可以用它来报告汽车的平均值,如下所示:
to-report means [ param ]
report mean [ param ] of turtles
end
Run Code Online (Sandbox Code Playgroud)
然而,这并没有按预期工作:
setup
repeat 15 [go]
show means houses
> ERROR: You can't use HOUSES in an observer context, because HOUSES is turtle-only.*
Run Code Online (Sandbox Code Playgroud)
param在这种情况下,如何让 Netlogo 在海龟的背景下进行评估?我熟悉如何在 R 中执行此操作(例如,通过tidy evaluation屏蔽{{ x }},或早期的引用机制),但不熟悉如何将其转换为 Netlogo。
正如错误所述,您试图将仅包含海龟的变量(房屋)传递给在观察者上下文中使用的过程,但这不起作用,因为 Netlogo 会在实际运行过程之前尝试将变量传递给过程。
相反,您可以使用以下代码。在此示例中,您首先使用“of”基元将房屋/汽车变量提取为列表。只有这样你才能将它们传递给“手段”程序,该程序由观察者运行。
to-report means [ param ]
report mean param
end
Run Code Online (Sandbox Code Playgroud)
show means [houses] of turtles
show means [cars] of turtles
Run Code Online (Sandbox Code Playgroud)